Как десериализовать массив псевдо-json в С#

Я могу быть глупым, но я застрял на этом.

Я кодирую на С# и пытаюсь разобрать строку JSON в объект. Проблема в том, что строка содержит поле данных, которое я называю псевдомассивом. Это не настоящий массив, потому что в нем отсутствуют символы []....

Я действительно не хочу создавать объект с 500 свойствами только для того, чтобы удовлетворить то, что я считаю ошибкой в ​​​​ответе API JSON, но как мне десериализовать это в объекты С#?

Ниже приведен пример JSON со страницы документации API. (у меня нет API, поэтому я не могу изменить JSON)

Любые советы будут оценены. спасибо к

`

{
    "data": {
        "71489": { <---- This is supposed to be an item in an array - but it isn't 
            "air_by_date": 0, 
            "cache": {
                "banner": 1, 
                "poster": 1
            }, 
            "language": "en", 
            "network": "USA Network", 
            "next_ep_airdate": "", 
            "paused": 0, 
            "quality": "HD720p", 
            "show_name": "Law & Order: Criminal Intent", 
            "status": "Ended", 
            "tvdbid": 71489, 
            "tvrage_id": 4203, 
            "tvrage_name": "Law & Order: Criminal Intent"
        }, 
        "140141": {
            "air_by_date": 0, 
            "cache": {
                "banner": 0, 
                "poster": 0
            }, 
            "language": "fr", 
            "network": "CBS", 
            "next_ep_airdate": "2012-01-15", 
            "paused": 0, 
            "quality": "Any", 
            "show_name": "Undercover Boss (US)", 
            "status": "Continuing", 
            "tvdbid": 140141, 
            "tvrage_id": 22657, 
            "tvrage_name": "Undercover Boss"
        }, 
...
        "194751": {
            "air_by_date": 1, 
            "cache": {
                "banner": 1, 
                "poster": 1
            }, 
            "language": "en", 
            "network": "TBS Superstation", 
            "next_ep_airdate": 2011-11-28", 
            "paused": 0, 
            "quality": "Custom", 
            "show_name": "Conan (2010)", 
            "status": "Continuing", 
            "tvdbid": 194751, 
            "tvrage_id": 0, 
            "tvrage_name": ""
        }, 
        "248261": {
            "air_by_date": 0, 
            "cache": {
                "banner": 1, 
                "poster": 1
            }, 
            "language": "en", 
            "network": "Cartoon Network", 
            "next_ep_airdate": "", 
            "paused": 1, 
            "quality": "HD", 
            "show_name": "NTSF:SD:SUV::", 
            "status": "Continuing", 
            "tvdbid": 248261, 
            "tvrage_id": 28439, 
            "tvrage_name": "NTSF:SD:SUV"
        }
    }, 
    "message": "", 
    "result": "success"
}
`

person Keil    schedule 29.03.2017    source источник


Ответы (1)


Свойство data вашего объекта JSON представляет собой ассоциативный массив. Вам нужно получить доступ к каждому элементу с помощью соответствующего ключа (в данном случае это числовая строка)

// convert from a String into a JObject
var data = JObject.Parse(json);

// access single property
Response.Write(data["data"]["71489"]);
Response.Write(data["data"]["140141"]);

// iterate all properties
foreach (JProperty prop in data["data"])
{
    Response.Write(prop.Name + ": " + prop.Value);

    // Also possible to access things like:
    // - prop.Value["air_by_date"]
    // - prop.Value["cache"]["banner"]
    // - prop.Value["cache"]["poster"]
    // - prop.Value["language"]
}
person dana    schedule 29.03.2017
comment
Это все хорошо, спасибо, но как бы я знал заранее, каковы значения ключей. Есть ли способ перебрать ключи? - person Keil; 29.03.2017
comment
@Keil - Да, я обновил свой ответ, чтобы показать, как это сделать. - person dana; 29.03.2017
comment
Ты жжешь! Спасибо - работает отлично. - person Keil; 29.03.2017