json - 使用 NewtonSoft 将 json 字符串转换并解析为键值对
问题描述
尝试使用 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);
}
解决方案
最后,@Brian Rogers 提供了一些指针,我提供了以下解决方案:
// Arrange
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'}]}
}}}";
// Act
var json = JObject.Parse(response);
var json_serial = (JProperty)json["result"].First();
var jObjectResult = new JObject(
json_serial.Value.Select(p =>
{
return new JProperty(
((JProperty)p).Name,
p.First.SelectToken("$.1[0].val")
);
}));
推荐阅读
- javascript - React Native Redux - 将变量传递给调度
- c# - WPF 根据条件切换默认值
- .net-core - 在包参考中使用 * 占位符时,dotnet restore 未更新到新版本
- excel - 如何遍历 Excel 列以读取单元格值以用作我的 PDFmerge 代码工作的文件编号?
- dynamics-crm - 使用相关记录批量更新联系人
- javascript - 除了第一个,如何改变面板的电流?
- go - 确保 net/http 客户端通过 TLS 1.2 连接的传输选项
- c# - 在代理服务下我无法获取客户端 IP
- r - 有谁知道如何修复 Rmarkdown 中的错误 61
- apache-spark - 使用 hive 和 spark 选择 count(*) 问题