我试图将奇怪形状的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
中的值)
答案 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>();