【问题标题】:Deserialize JSON with dynamic key into Object使用动态键将 JSON 反序列化为 Object
【发布时间】:2019-07-03 19:18:43
【问题描述】:

我知道关于这个话题已经提出了一些问题,但是我仍然很难理解它。我有一个相当复杂的 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;

我确信我在这里遗漏了一些东西,但他整天都在努力寻找解决方案。任何帮助将不胜感激!

【问题讨论】:

    标签: json dynamic model json.net key


    【解决方案1】:

    你很接近。

    在您的 JSON 中,动态键位于根级别,因此该对象需要由 Dictionary&lt;string, ISBN&gt; 表示。您似乎已经意识到这一点,但是,在您的模型中,您添加了一个外部类来包含字典。这与 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

    【讨论】:

      猜你喜欢
      • 2021-04-19
      • 2012-11-11
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多