将任何Json解析为Key值对

时间:2017-04-21 08:06:03

标签: c# .net json json.net

我尝试使用Fiddler读取所有请求和响应,但在某些情况下,我将请求数据作为JSON获取,并且我想将该JSON解析为键值对。

我试过这样的

string requestPost = Utilities.UrlDecode(oSession.GetRequestBodyAsString());
Dictionary<string, string> jsonRequest = new Dictionary<string, string>();
jsonRequest = JsonConvert.DeserializeObject<Dictionary<string, string>>(requestPost);
dataGridViewFiddler.DataSource = jsonRequest;

但这对我没有用。

这是我的Json格式

{"entries":[{"http_response_code":200,"network_changed":false,"protocol":"QUIC","request_age_ms":112425,"request_elapsed_ms":27,"sample_rate":0.05,"server_ip":"216.58.197.78:443","status":"ok","url":"https://www.google-analytics.com/","was_proxied":false}],"reporter":"chrome"}

现在,如果我使用动态来解析这个json的工作,但是

enter image description here

2 个答案:

答案 0 :(得分:2)

您表示您可以接收任何JSON 。但是,这将导致严峻的挑战,因为您仍然需要解析数据以便以某种结构化的方式使用它。因此,您应确保始终获得类似的输入。我将为您提供最适合的选项。

选项1 :只有当您的数据遵循JSON布局时,才能将Dictionary反序列化为key/value。所以布局应该总是这样:

{
    "key1": "value1",
    "key2": "value2"
}

当然,您的价值也可以是一个清单。但是,基本布局仍然相同。例如:

{
    "key1": ["value1", "value2"],
    "key2": ["value3", "value4"]
}

您可以使用代码反序列化:

var dict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(requestPost);

选项2:如果您的JSON数据采用自定义数据名称构建,则必须创建相应的模型。 json2csharp是一个很好的工具,可以让你走上正轨。{3}}。让我举个例子。如果这是您的JSON

[{
    "Key": "MyKey",
    "Values": [{
        "First": "RandomValue",
        "Second": "RandomValue"
    }, {
        "First": "RandomValue",
        "Second": "RandomValue"
    }]
},
{
    "Key": "MyKey",
    "Values": [{
        "First": "RandomValue",
        "Second": "RandomValue"
    }, {
        "First": "RandomValue",
        "Second": "RandomValue"
    }]
}]

然后你的相应模型应该是:

public class Value
{
    public string First { get; set; }
    public string Second { get; set; }
}

public class RootObject
{
    public string Key { get; set; }
    public List<Value> Values { get; set; }
}

你可以像这样反序列化它:

var values = JsonConvert.DeserializeObject<List<RootObject>>(json);

结束,您可以确保JSON数据的结构为Dictionary key/value对。在这种情况下,您可以直接反序列化为Dictionary。否则,您必须创建自定义模型以适合您的JSON数据。使用最适合你的东西! 请注意可以反序列化随机数据,但这会让您很难确保代码可以处理数据!有关如何执行此操作,请参阅Luke's answer

答案 1 :(得分:1)

如果您希望能够反序列化任何JSON ,那么您需要反序列化的类型只是cs.setUnderlying(&as);,而不是dynamic,因为这意味着您必须在你的JSON中有一个字符串键...

因此,要反序列化任何JSON对象,按要求,您需要使用代码:

Dictionary<string, dynamic>

请记住,JSON可以像以下一样简单:

var json = JsonConvert.DeserializeObject(requestPost);

哪个与您的模型不匹配,因为没有键(字典中的字符串)。

相关问题