Как правильно распарсить сложносоставной JSON на C# (Json.NET)

Есть сложносоставной json

введите сюда описание изображения

[{
    "coordinates": [{
        "oid": "ljv54",
        "x": 4516,
        "y": 0,
        "mark": "1",
        "z": 813
    }, {
        "oid": "ku35yt",
        "x": 1463,
        "mark": "2"
    }, {
        "oid": "i54yt",
        "x": 4511,
        "mark": "688"
    }, {
        "oid": "2lgfv",
        "x": 2435,
        "mark": "61"
    }],
    "prefix": "https://www.example.com/"
}, {
    "view": false,
    "rank1": 575,
    "rank2": 812,
    "initial": false,
    "show": false,
    "value1": "foo",
    "value2": "foo",
    "info": {
        "[Info]": {
            "locals": [{
                "ler": "ler",
                "Url": "http://",
                "Track": "/url?"
            }],
            "About": "https://",
            "Preview": "https://",
            "online": {
                "url": "https://",
                "pr": "ag",
                "list_pr": "ag68"
            },
            "Toc": [{
                "Title": "abc",
                "oid": "ux085",
                "Num": "18373",
                "Order": 17647
            }, {
                "Title": "dddddd",
                "oid": "ux0965",
                "Num": "58737",
                "Order": 5863
            }]
        }
    },
    "last": {
        "oid": "ux025",
        "x": 24672,
        "y": 43737
    }
}, {
    "boolparam1": true,
    "boolparam2": true,
    "boolparam3": false,
}, {
    "volume": [{
        "pid": "ux459",
        "src": "abc",
        "flags": 1011,

    }, {
        "pid": "ux94",
        "src": "bce"
    }, {
        "pid": "ux59",
        "src": "yfg"
    }, {
        "pid": "ux85",
        "src": "hgd"
    }]
}, null, null, {
    "crossvalidation": [{
        "id": 10991,
        "value": "abc",
        "descr": "",
        "num": 0,
        "metadata": false,
        "def": true,

    }, {
        "id": 10992,
        "title": "abc",
        "descr": "",
        "num": 0,
        "metadata": false,
        "def": true,
        "access": true,

    }],
    "uid": "999990000011101"
}]

На этом примере он включает 7 записей верхнего порядка (5 со значениями, плюс 2 null). Каждая из этих записей имеет уникальные наборы пар {ключ:значение}, и таких пар для каждой записи больше 50 (на картинке меньше, т.к. оставил минимум, чтобы просто было наглядно). Если идти "традиционным" путём, то мне надо создать

public class RootObject
{
   List<Data> response = new List<Data>();
}

public class Data
{
   [JsonProperty("coordinates", NullValueHandling = NullValueHandling.Ignore)]
   public Coordinates[] Coordinates { get; set; }

   [JsonProperty("prefix", NullValueHandling = NullValueHandling.Ignore)]
   public Uri Prefix { get; set; }

   [JsonProperty("view", NullValueHandling = NullValueHandling.Ignore)]
   public bool View { get; set; }

   // И тут ещё больше 300 пропертей.
}

В результате получаем класс-франкенштейн, где смешались в кучу люди, кони и т.д. А хотелось бы вместо коллекции List<Data> response получить массив объектов Object[] response = { MyClass1 obj0, MyClass2 obj1 , ... }

Сейчас я делаю вот так

JArray arr = JArray.Parse(json);
MyClass1 obj0 = JsonConvert.DeserializeObject<MyClass1>(arr[0].ToString());
MyClass2 obj1 = JsonConvert.DeserializeObject<MyClass2>(arr[1].ToString());
MyClass3 obj2 = JsonConvert.DeserializeObject<MyClass3>(arr[2].ToString());
Object[] response = { obj0, obj1, obj2, ... }

Мало того, что это выглядит как-то по-уродски, так ещё вызывает вопросы цепочка JSON -> string -> JArray -> string -> .net Object. Как правильно десериализовать такой JSON?


Ответы (0 шт):