【问题标题】:Parse any Json into Key value pair将任何 Json 解析为键值对
【发布时间】:2017-04-21 08:06:03
【问题描述】:

我尝试使用 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 它的工作但是

【问题讨论】:

  • 请告诉我们requestPost 长什么样子?
  • @Luke requestpost 可以是任何 json..
  • 如果您的 JSON 真的可以是任何东西,那么“How do I use JSON.NET to deserialize into nested/recursive Dictionary and List?”可能会对您有所帮助。但请注意,并非每个 JSON 都可以解析为键值对。如果你从 JSON 中的一个数组开始,那么你在解析它时会得到一个列表。

标签: c# .net json json.net


【解决方案1】:

您表明您可以接收任何 JSON。但是,这将带来严峻的挑战,因为您仍然必须解析数据才能以某种结构化的方式使用它。因此,您应该确保始终获得类似的输入。我会给你最适合的选项。

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

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

当然,你的值也可以是一个列表。但是,基本布局还是一样的。例如:

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

你可以用你的代码反序列化:

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

选项 2:如果您的 JSON 数据是使用自定义数据名称构建的,则您必须创建相应的模型。 json2csharp 是一个可以让你走上正轨的好工具。让我举个例子。如果这是你的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 数据结构为 Dictionarykey/value 对。在这种情况下,您可以直接反序列化为Dictionary。否则,您将不得不创建自定义模型以适应您的 JSON 数据。使用最适合您的方法! 请注意,可以只反序列化随机数据,但是很难确保您的代码可以处理数据!请参阅 Luke's answer 了解如何执行此操作。

【讨论】:

    【解决方案2】:

    如果您希望能够反序列化任何 JSON,那么您需要反序列化的类型就是 dynamic,而不是 Dictionary&lt;string, dynamic&gt;,因为这意味着您必须拥有JSON 中的字符串键...

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

    var json = JsonConvert.DeserializeObject(requestPost);
    

    请记住,JSON 可以很简单:

    ["bob", "fred"]
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-24
      • 2012-09-20
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      相关资源
      最近更新 更多