首页 > 解决方案 > 使用 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);
        }

标签: jsonasp.net-corejson.net

解决方案


最后,@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")
            );
        }));

推荐阅读