2017-02-28 39 views
-1

我试图反序列化下面的古怪形状的JSON对象成更有道理的类。反序列化古怪形状的JSON对象与Json.NET

{ 
    "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响应,我不想为它们每个编写一个Converter。我需要的是能够根据属性名称解析值的东西(例如:对于<class-name>.<property-name>查找item/<property-name>/value中的值)

+0

您可能需要自定义转换。 – user3682091

+0

http://json2csharp.com –

回答

0

使用SelectToken然后直接使用ToObject。

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

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

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

这并不能解决我的问题。 –

+1

你只是试图将JSON反序列化为一个列表?完成此操作后,您可以循环提取相应的信息。 – Aaron

0

我已经把它变成只含"key":"value"属性的新J Object中可以通过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>();