Валидация JSON сериализации / десериализации до c# double - PullRequest
1 голос
/ 05 февраля 2020

Как мне получить схему, которая проверяет для двойного c#?

Двойным значением c# может быть: "NaN", "Infinity", "-Infinity". И это важно в нашей системе, поскольку в зависимости от этих значений существует лог c.

Сериализация / десериализация JSON работает отлично. Но я не могу проверить это в следующем примере, если JSON для десериализации содержит какую-то другую строку, которую нельзя преобразовать в double. Проверка проходит, а затем происходит сбой только при десериализации.

        [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; }
        }

1 Ответ

1 голос
/ 06 февраля 2020

Вы, вероятно, хотите иметь определение для 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" }

, где myDouble и myOtherDouble являются свойствами, ограниченными для проверки по #/definitions/csharpDouble

Затем в десериализаторе может потребоваться предоставить пользовательский лог c для десериализации строковых значений в соответствующие поля stati c типа double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...