C#: JSON Schema validation and JSON.stringify



[对不起,我的英语很糟糕]

现在我使用 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);

相关内容

  • 没有找到相关文章