Как вызвать исключение, когда JSON не десериализуется в мой объект - PullRequest
3 голосов
/ 20 марта 2012

Я пишу автоматизацию тестирования для веб-службы RESTful (полезной нагрузки JSON) в .NET и хотел бы проверить, что отправленные мне объекты имеют точно полей в определяемом мной DTO, не более илиМеньше.

Однако, похоже, что метод сериализации, который я использую (System.Web.Script.Serialization), не возражает, когда типы объектов не совпадают.

    private class Dog
    {
        public string name;
    }
    private class Cat
    {
        public int legs;
    }
    static void Main(string[] args)
    {
        var dog = new Dog {name = "Fido"};
        var serializer = new JavaScriptSerializer();
        String jsonString = serializer.Serialize(dog);
        var deserializer = new JavaScriptSerializer();
        Cat cat = (Cat)deserializer.Deserialize(jsonString, typeof(Cat)); 
        //No Exception Thrown! Cat has 0 legs.
    }

Есть лиБиблиотека сериализации .NET, которая поддерживает это требование?Другие подходы?

1 Ответ

3 голосов
/ 20 марта 2012

Эту проблему можно решить с помощью проверки схемы JSON.Самый простой способ сделать это - использовать функцию отражения схемы Json.NET , например:

using System.Diagnostics;
using Newtonsoft.Json;
using Newtonsoft.Json.Schema;

public class Dog
{
    public string name;
}

public class Cat
{
    public int legs;
}

public class Program
{
    public static void Main()
    {
        var dog = new Dog {name = "Fido"};

        // Serialize the dog
        string serializedDog = JsonConvert.SerializeObject(dog);

        // Infer the schemas from the .NET types
        var schemaGenerator = new JsonSchemaGenerator();
        var dogSchema = schemaGenerator.Generate(typeof (Dog));
        var catSchema = schemaGenerator.Generate(typeof (Cat));

        // Deserialize the dog and run validation
        var dogInPotentia = Newtonsoft.Json.Linq.JObject.Parse(serializedDog);

        Debug.Assert(dogInPotentia.IsValid(dogSchema));
        Debug.Assert(!dogInPotentia.IsValid(catSchema));

        if (dogInPotentia.IsValid(dogSchema))
        {
            Dog reconstitutedDog = dogInPotentia.ToObject<Dog>();
        }
    }
}

Более общую информацию о функции можно найти здесь .

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