Десериализовать JSON с динамическим ключом в Object - PullRequest
0 голосов
/ 10 февраля 2019

Я знаю, что уже были подняты некоторые вопросы по этой теме, но я все еще пытаюсь понять это.У меня довольно сложный объект JSON, который имеет динамический ключ в начале.Я пытаюсь десериализовать его в объектную модель C #, но моя проблема заключается в динамическом ключе:

{
"ISBN:0903393972": {
    "bib_key": "ISBN:0903393972",
    "details": {
        "publishers": ["Sweet & Maxwell"],
        "physical_format": "Hardcover",
        "title": "Tanker Voyage Charter Parties",
        "created": {
            "type": "/type/datetime",
            "value": "2008-04-30T09:38:13.731961"
        },
        "authors": [{
            "name": "F.M. Ventris",
            "key": "/authors/OL3610236A"
        }],
}}}

Моя головная боль возникает из-за динамической части "ISBN: 0903393972".Ниже также приведена часть модели:

[DataContract]
public class Created
{
    [DataMember]
    public string type { get; set; }
    [DataMember]
    public DateTime value { get; set; }
}

[DataContract]
public class Author
{
    [DataMember]
    public string name { get; set; }
    [DataMember]
    public string key { get; set; }
}

[DataContract]
public class Details
{
    [DataMember]
    public List<string> publishers { get; set; }
    [DataMember]
    public string physical_format { get; set; }
    [DataMember]
    public string title { get; set; }
    [DataMember]
    public Created created { get; set; }
    [DataMember]
    public List<Author> authors { get; set; }
}

[DataContract]
public class ISBN
{
    [DataMember]
    public string bib_key { get; set; }
    [DataMember]
    public Details details { get; set; }
}

[DataContract]
public class RootObject
{
    public Dictionary<string, ISBN> bookRoot { get; set; }
}

Я десериализирую формат JSON с помощью приведенного ниже кода (который работает, если я жестко кодирую «ISBN: 0903393972» в качестве ключа объекта):

        string json = new WebClient().DownloadString(URLAddress);
        JObject book = JObject.Parse(json) as JObject;

        // Copy to a static Album instance
        RootObject deserializedBook = book.ToObject<RootObject>();

        return deserializedBook;

Я уверен, что что-то здесь упускаю, но целый день боролся за то, чтобы найти решение.Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 10 февраля 2019

Вы рядом.

В вашем JSON динамические ключи находятся на корневом уровне, и поэтому объект должен быть представлен Dictionary<string, ISBN>.Кажется, вы поняли это, однако в вашей модели вы добавили внешний класс для словаря.Это не совпадает с JSON и здесь не нужно.Вместо этого вы должны десериализовать непосредственно в словарь:

string json = new WebClient().DownloadString(URLAddress);
var bookRoot = JsonConvert.DeserializeObject<Dictionary<string, ISBN>>(json);

Оттуда вы можете перебрать коллекцию Values в словаре, чтобы получить доступ к книгам без необходимости заранее знать ключ (ы):

foreach (var isbn in bookRoot.Values)
{
    // ...
}

Или, если вы ожидаете только одну книгу, вы можете получить ее из словаря следующим образом:

var isbn = bookRoot.Values.First();

Вот рабочая демонстрация: https://dotnetfiddle.net/csgSKp

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