Как правильно распарсить сложносоставной 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?
