Как десериализовать разные представления JSON одного и того же класса? - PullRequest
0 голосов
/ 29 января 2019

У меня есть класс C #, который клиенты могут представлять в двух разных схемах JSON, в зависимости от контекста.

    public class Point
    {
        [JsonProperty("x")]
        public double? X { get; set; }

        [JsonProperty("y")]
        public double? Y { get; set; }
    }

    public class Multipoint
    {
        [JsonProperty("points")]
        public List<Point> Points { get; set; }
    }

, где Multipoint - это просто список Point.

Синтаксис JSON для Point:

{"x" : <x>, "y" : <y>}

, который я могу успешно десериализовать с помощью Json.NET.

Однако синтаксис JSON для Multipoint:

{"points" : [[ <x1>, <y1> ] , [ <x2>, <y2> ], ... ]}

, для которого при попытке десериализации возникает следующая ошибка:

Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип 'Deserialization.Point', потому что типу требуется объект JSON (например, {"name": "value"}) для правильной десериализации.Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {"name": "value"}), либо измените десериализованный тип на массив или тип, который реализует интерфейс коллекции (например, ICollection, IList), например List, который можетбыть десериализованным из массива JSON.JsonArrayAttribute также можно добавить к типу, чтобы принудительно десериализовать его из массива JSON.

Правильно, да, потому что сериализатор не знает, как назначать элементы внутреннего массива (пара ординат) к свойствам X и Y.

Таким образом, это можно сделать, создав специальный десериализатор для назначения правильной ординаты правильному свойству.Однако я не понимаю, как я могу назначить 2 разных сериализатора моему типу.

1 Ответ

0 голосов
/ 29 января 2019

Возможно, пользовательское ItemConverterType для свойства Multipoint.Points.

public class Multipoint
{
    [JsonProperty(PropertyName = "points", ItemConverterType = typeof(MyPointsConverter))]
    public List<Point> Points { get; set; }
}

Преобразователь должен реализовывать JsonConverter.

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