jerry0davis Ответов: 3

Класс десериализации JSON с различными именами членов


У меня есть несколько json для живых автобусных остановок прибытия и отправления.

{
    "atcocode": "269030083",
    "smscode": "lecdgpja",
    "request_time": "2019-05-25T13:45:14+01:00",
    "name": "St Margaret's Bus Station (Stand SM)",
    "stop_name": "St Margaret's Bus Station",
    "bearing": "",
    "indicator": "Stand SM",
    "locality": "Leicester",
    "location": {
        "type": "Point",
        "coordinates": [
            -1.1339,
            52.6397
        ]
    },
    "departures": {
        "153": [
            {
                "mode": "bus",
                "line": "153",
                "line_name": "153",
                "direction": "Market Bosworth, Terminus (unmarked)",
                "operator": "AMID",
                "date": "2019-05-25",
                "expected_departure_date": null,
                "aimed_departure_time": "13:45",
                "expected_departure_time": null,
                "best_departure_estimate": "13:45",
                "source": "NextBuses",
                "dir": "outbound",
                "id": "https://transportapi.com/v3/uk/bus/route/AMID/153/outbound/269030083/2019-05-25/13:45/timetable.json?app_id=ID&app_key=KEY",
                "operator_name": "Arriva Midlands"
            },
            {
                "mode": "bus",
                "line": "153",
                "line_name": "153",
                "direction": "Market Bosworth, Terminus (unmarked)",
                "operator": "AMID",
                "date": "2019-05-25",
                "expected_departure_date": null,
                "aimed_departure_time": "14:45",
                "expected_departure_time": null,
                "best_departure_estimate": "14:45",
                "source": "NextBuses",
                "dir": "outbound",
                "id": "https://transportapi.com/v3/uk/bus/route/AMID/153/outbound/269030083/2019-05-25/14:45/timetable.json?app_id=ID&app_key=KEY",
                "operator_name": "Arriva Midlands"
            },
            {
                "mode": "bus",
                "line": "153",
                "line_name": "153",
                "direction": "Market Bosworth, Terminus (unmarked)",
                "operator": "AMID",
                "date": "2019-05-25",
                "expected_departure_date": null,
                "aimed_departure_time": "15:45",
                "expected_departure_time": null,
                "best_departure_estimate": "15:45",
                "source": "NextBuses",
                "dir": "outbound",
                "id": "https://transportapi.com/v3/uk/bus/route/AMID/153/outbound/269030083/2019-05-25/15:45/timetable.json?app_id=ID&app_key=KEY",
                "operator_name": "Arriva Midlands"
            }
        ]
    },
    "source": "NextBuses"
}


В этом примере вылет имеет член "153", но очевидно, что по мере изменения названий автобусов имя члена изменится, например, на "N1" и т. д.

Что я уже пробовал:

Я пробовал сделать depatures словарем, но когда я foreach через словарь, я просто получаю нулевые значения....

public class Departures
{
    public Dictionary<string, listing_details> listing { get; set; }
}

public class listing_details
{
    public string mode { get; set; }
    public string line { get; set; }
    public string line_name { get; set; }
    public string direction { get; set; }
    public string @operator { get; set; }
    public string date { get; set; }
    public string expected_departure_date { get; set; }
    public string aimed_departure_time { get; set; }
    public string expected_departure_time { get; set; }
    public string best_departure_estimate { get; set; }
    public string source { get; set; }
    public string dir { get; set; }
    public string id { get; set; }
    public string operator_name { get; set; }
}


Может ли кто-нибудь подсказать, как я буду перебирать разные списки именных автобусов, пожалуйста? В этом примере это будет departures.153, но для автобуса N1, но это может быть departures.N1 . к сожалению, я не буду знать названия автобусов, пока не получу JSON, поэтому я компетентно озадачен. Любая помощь будет оценена по достоинству! Спасибо.

F-ES Sitecore

Невозможно дать конкретную помощь, если мы не знаем, что вы используете для десериализации json. Я считаю Json.NET newtonsoft может справиться с динамическими формате JSON.

jerry0davis

Как вы и предсказывали - NewtonsoftJSON

BusTimeTable resultsBTT = JsonConvert.DeserializeObject<BusTimeTable>(responseString);


Как я itterate через динамический JSON с использованием NewtonsoftJSON?

Спасибо

3 Ответов

Рейтинг:
24

F-ES Sitecore

Возможно, вам придется немного поиграть с этим, но это основа

JObject o = JObject.Parse(responseString);

// one way to read the values of the main object
string atcocode = o.Value<string>("atcocode");

JToken departures = o["departures"];

// your departures node only has one property (eg "153") so get it using First
JToken departure = departures.First;

JProperty prop = ((JProperty)departure);
string number = prop.Name; // 153

// get the items in 153 as a list
List<listing_details> details = prop.Value.ToObject<List<listing_details>>(); 


Рейтинг:
20

Graeme_Grant

Что вы можете сделать, так это написать пользовательский конвертер и сформировать результаты в формат, с которым вы можете работать. Я подробно обсуждаю работу с пользовательскими конвертерами здесь:
Работа с JSON в C# & VB > нестандартных типах и типах структур данных[^]


Рейтинг:
2

Richard Deeming

Есть несколько списков для каждого автобуса. Самым простым решением было бы:

public class Departures
{
    public Dictionary<string, List<listing_details>> departures { get; set; }
}