【发布时间】:2020-05-28 13:07:37
【问题描述】:
尝试使用 Newtonsoft 将 json 字符串转换为键值对,但目前没有运气。
来自 API 的响应:
var response = @"{'result':{'0199 - B344EE33':
{
'6400_00260100':{'1':[{'val':336688}]},
'6400_00462500':{'1':[{'val':null}]},
'6800_00832A00':{'1':[{'low':3000,'high':3000,'val':3000}]},
'6800_008AA200':{'1':[{'low':0,'high':null,'val':0}]}
}}}";
我想要的结果是一个新的键值对对象:
{
"6400_00260100" : 336688,
"6400_00462500" : null,
"6800_00832A00" : 3000,
"6800_008AA200" : 0
}
在响应中,result 将始终是第一个也是唯一的道具。在下一个级别中,代码0199 - B344EE33 可以更改,但在此级别中只有一个道具,所以我们总是可以拿第一个。然后在最后一层我们总是需要val 属性。
我所拥有的是以下内容,但为了以干净的方式获取键值对,我陷入了困境:
var json = JObject.Parse(response);
var result = json["result"].First;
var path = result.Path;
更新
var jObjectResult = new JObject();
var response = @"{'result':{'0199 - B344EE33':
{
'6800_10821E00':{'1':[{'val':'SMA Sunny Boy'}]},
'6800_00A21E00':{'1':[{'val':'3.0.0.2222'}]},
'6800_00823400':{'1':[{'low':3000,'high':3000,'val':3000}]},
'6800_08822B00':{'1':[{'val':'SMA'}]},
'6800_08822000':{'1':[{'val':'Sunny Boy 3.0'}]}
}}}";
var json = JObject.Parse(response);
var json_serial = json["result"].First.Children<JObject>().ToList()[0];
foreach(var token in json_serial)
{
var tokenKey = token.Key;
var tokenVal = token.Value.SelectToken("$.1[0].val");
jObjectResult.Add(tokenKey, tokenVal);
}
【问题讨论】:
-
您的 JSON 示例看起来有多层嵌套。您可能最好先尝试将其放入 c# 类对象,然后将您需要的位投影到字典中。
-
@t.karalis 我为什么要这样做?我只需要将其中的 key 和 val 值放入字典或列表或其他任何内容中。创建嵌套对象来实现这一点似乎有点过头了。
-
只是从不同的角度来看,如果有一种方法可以反序列化它而不必手动解析 json,那么这对我来说似乎更简单;) 诚然,我还没有想出还有什么。
-
有一些工作,请参阅我的问题中的更新,但也许可以简单化。
-
太好了,我唯一要避免的是不必要地致电
.ToList()。我将 .ToList()[0] 替换为.First()或.FirstOrDefault()
标签: json asp.net-core json.net