使用Json.NET反序列化形状奇特的JSON对象

时间:2017-02-28 04:36:36

标签: c# json serialization

我试图将奇怪形状的JSON对象反序列化到更有意义的类中。

{
    "item": {
        "article_title": {
            "type": "text",
            "value": "Title of article 1"
        },
        "content": {
            "type": "text",
            "value": "Article 1 content"
        },
        "related_articles": {
            "type": "related",
            "value": [
                "article2"
            ]
        }
    },
    "additional_items": {
        "article2": {
            "article_title": {
                "type": "text",
                "value": "Title of article 2"
            },
            "content": {
                "type": "text",
                "value": "Article 2 content"
            },
            "related_articles": {
                "type": "related",
                "value": []
            }
        }
    }
}

反序列化为以下Article

public class Article {
    public string ArticleTitle;
    public string Content;
    public List<Article> RelatedArticles;
}

JSON在其根对象中有两个属性。 Item是当前项,additional_items属性包含related_articles属性中引用的任何其他项。

我能够基于此处描述的JsonConverter解决方案Parse json with different types value (Newtonsoft.Json)创建一个可行的解决方案,但这实际上并不是我需要的。我有很多类似于这个的JSON响应,我不想为每个响应器编写一个转换器。我需要的是能够根据属性名称解析价值的东西(例如:<class-name>.<property-name>寻找item/<property-name>/value中的值)

2 个答案:

答案 0 :(得分:0)

使用SelectToken然后直接使用ToObject。

var article = JObject.Parse(json).SelectToken("item").ToObject<List<Article>>();

反序列化你可以做这样的事情

List<string[]> data = JsonConvert.DeserializeObject<List<string[]>>(jsonString);

答案 1 :(得分:0)

我已经通过将其转换为仅包含"key":"value"属性的新JObject来解决它,这些属性可以很容易地被newtonsoft.json解析

JObject fields = new JObject();
foreach (var property in ((JObject)response.SelectToken("$.item.elements")).Properties())
{
    // Remove underscore characters to support loading into PascalCase property names in CSharp code
    string propertyName = property.Name.Replace("_", "");
    fields.Add(propertyName, property.First["value"]);
}

return fields.ToObject<T>();