[对不起,我的英语很糟糕]
现在我使用 JSON.Net,但它对数字类型的验证过于严格。问题是JSON.stringify认为"数字"和"整数"之间没有区别,他只有"数字"。事实证明,如果你序列化 1.0,输出将只有 1(整数(,而 JSON.Net 验证器将是预期的"数字"。
我不想在"int"中分配">数字",我想在"浮点数"中分配"整数"。示例架构:
{
"type": "object",
"properties": {
"singleField": {
"type": "number"
}
}
}
示例 JSON:
{
"singleField":1//it is 1.0 after JSON.stringify
}
验证将失败。
最合适的解决方案是在客户端上使用架构,但没有这种可能性。我不受 JSON.Net 束缚,所以要做出任何决定。我使用 .net 3.5。
原因在旧版本的 JSON.Net 中。此代码有效:
using Newtonsoft.Json;
using Newtonsoft.Json.Schema;
using Newtonsoft.Json.Schema.Generation;
public class JSSchemaTest
{
class TestClass
{
public float field = 20;
}
JSchemaGenerator generator = new JSchemaGenerator();
JsonSerializer serializer = new JsonSerializer();
public void Run()
{
JSchema schema = generator.Generate(typeof(TestClass));
JsonTextReader reader = new JsonTextReader(new System.IO.StringReader("{field: 2}"));
JSchemaValidatingReader validatingReader = new JSchemaValidatingReader(reader);
validatingReader.Schema = schema;
TestClass res = serializer.Deserialize<TestClass>(validatingReader);
}
}
Json.NET 8.0.2 Json.NET 架构 2.0.2 中使用。
UPD:作为替代方案,在旧版本的 JSON.Net 中,我们可以在文件 JsonSchemaGenerator 中进行小的修改。搜索此行:
internal static bool HasFlag(JsonSchemaType? value, JsonSchemaType flag)
并将其"返回"替换为拥有:
return (flag == JsonSchemaType.Integer && value == JsonSchemaType.Float) ? true : ((value & flag) == flag);