[英]How do I get nested JSON values in c#?
我从服务返回以下JSon字符串:
{
"links": {
"data": {
"self": {
"body": "",
"content_type": "",
"href": "",
"method": "GET",
"name": ""
}
}
},
"results": [{
"data": {
"categories": {
"41370_10": "abc",
"41370_11": "abc",
"41370_2": "abc",
"41370_5": "abc"
}
},
"metadata": {
"categories": {
"41370": {
"key": "41370",
"name": "123"
},
"41370_10": {
"bulk_shared": false,
"key": "41370_10",
"name": "some name"
},
"41370_11": {
"allow_undefined": false,
"key": "41370_11",
"name": "some name 2"
},
"41370_2": {
"key": "41370_2",
"key_value_pairs": false,
"name": "some name 3"
}
}
}
},
{
"data": {
"categories": {
"72051_2": "asd",
"72051_3": "asd"
}
},
"metadata": {
"categories": {
"72051": {
"key": "72051",
"name": "some name 4"
},
"72051_2": {
"key": "72051_2",
"name": "some name 5"
}
}
}
},
{
"data": {
"categories": {
"112644_2": "zxc"
}
},
"metadata": {
"categories": {
"112644": {
"key": "112644",
"name": "some name 6"
},
"112644_2": {
"hidden": false,
"key": "112644_2",
"name": "some name 7"
}
}
}
}]
}
如何处理这些数据以获得一个漂亮,简单的字典? 它看起来像这样:
{"some name", "abc"},
{"some name 2", "abc"},
{"some name 3", "abc"},
{"some name 5", "asd"},
{"some name 6", "zxc"}
目前正在尝试使用c#,json.net,但收效甚微。 任何帮助非常感谢。
更新1:我已经得到了JTokens的功能,但我不确定如何将数据与元数据分开(是的,我意识到这听起来多么荒谬)。
//get json object
JObject cjob = JObject.Parse(response.Content.ReadAsStringAsync().Result);
IEnumerable<JToken> categorymetadata = cjob.Descendants()
.Where(t => t.Type == JTokenType.Property && ((JProperty)t).Name == "categories")
.SelectMany(p => ((JProperty)p).Value);
以下LINQ-to-JSON查询应该为您提供所需的结果:
Dictionary<string, string> dict = cjob["results"]
.Children<JObject>()
.Select(result => result.SelectToken("metadata.categories").Children<JProperty>()
.Join(result.SelectToken("data.categories").Children<JProperty>(),
metaCat => metaCat.Name,
dataCat => dataCat.Name,
(metaCat, dataCat) => new
{
Name = (string)metaCat.Value["name"],
Value = (string)dataCat.Value
}
)
)
.SelectMany(a => a)
.ToDictionary(a => a.Name, a => a.Value);
foreach (var kvp in dict)
{
Console.WriteLine(kvp.Key + ": " + kvp.Value);
}
这会在metadata
对象中的类别与每个结果的data
对象中的类别之间进行内部联接,并将联接的属性选择为匿名名称 - 值对的列表(实际上是IEnumerable)。 然后将对列表展平为单个列表,最后放入字典中。
我对您的数据做出以下假设:
如果这些假设不成立,您将遇到错误并需要对代码进行调整。
这是一个工作演示: https : //dotnetfiddle.net/WkztV5
我建议使用JsonConvert.DeserializeObject,你可以将你的json反序列化为对象,然后用这些对象做你想做的事情,例如:
public class Account
{
public string Email { get; set; }
public bool Active { get; set; }
public DateTime CreatedDate { get; set; }
public IList<string> Roles { get; set; }
}
string json = @"{
'Email': 'james@example.com',
'Active': true,
'CreatedDate': '2013-01-20T00:00:00Z',
'Roles': [
'User',
'Admin']
}";
Account account = JsonConvert.DeserializeObject<Account>(json);
Console.WriteLine(account.Email);
// james@example.com
https://www.newtonsoft.com/json/help/html/DeserializeObject.html
如果你想把你的json转换成对象而不想出来: http : //json2csharp.com/是一个非常漂亮的工具,只需复制并将你的json复制到那里。
在你的情况下,你将有一个这样的根对象:
public class RootObject
{
public Links links { get; set; }
public List<Result> results { get; set; }
}
并且您可以查看结果以获得您想要的结果。
我认为这样做很容易,但我在JSON层次结构中只有几个级别
dynamic deserialized = JsonConvert.DeserializeObject((string)data);
newObj = deserialized["objName"].value == null ? "" : deserialized["objName"].value;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.