首页 > 解决方案 > 验证 JSON 序列化/反序列化为 c# double

问题描述

我怎样才能有一个验证 c# double 的模式?

c# double 可以是:“NaN”、“Infinity”、“-Infinity”。这在我们的系统中很重要,因为存在取决于这些值的逻辑。

JSON 序列化/反序列化完美运行。但我无法验证的是在下面的示例中,如果要反序列化的 JSON 包含一些无法转换为双精度的不同字符串。验证通过,然后它只会在反序列化中崩溃。

        [TestMethod]
        public void test3()
        {
            string json = @"{'A':'hello'}";

            // validate
            string myschemaJson = @"{
            'description': 'An employee', 'type': 'object',
            'properties':
                {
                   'A': {'allOf':[{'type':'string','enum': ['NaN','Infinity','-Infinity']}, {'type':'number'}]}
                }
            }";

            var schema = JsonSchema.Parse(myschemaJson);
            JObject myObjJson = JObject.Parse(json);

            // validation
            bool isValid = myObjJson.IsValid(schema, out IList<string> errors);

            isValid.Should().BeTrue(string.Join(",\n", errors.ToArray()));

            // deserialize
            var deserializeObject = JsonConvert.DeserializeObject<MySimpleObj>(json);
            Console.WriteLine(deserializeObject.A);
        }

        public class MySimpleObj
        {
            public double A { get; set; }
        }

标签: c#jsonjson.netjsonschema

解决方案


您可能希望有一个csharpDouble(或类似的)定义,您可以在其中定义它可以是

  • 一个数字,或
  • 值之一"NaN", "Infinity", 或"-Infinity"

首先,你需要

{ "type": "number" }

第二个,你想要

{ "enum": [ "NaN", "Infinity", "-Infinity" ] }

所以你的架构是

{
  ...
  "definitions": { // or $defs for draft 2019-09
    ...
    "csharpDouble": {
      "oneOf": [
        { "type": "number" },
        { "enum": [ "NaN", "Infinity", "-Infinity" ] }
      ]
    },
    ...
  },
  ...
}

这将允许像

{ "myDouble": 5.24, "myOtherDouble": "NaN" }

其中myDoublemyOtherDouble都是受限于验证的属性#/definitions/csharpDouble

然后在您的反序列化器中,您可能需要提供自定义逻辑来将字符串值反序列化为double类型上的适当静态字段。


推荐阅读