簡體   English   中英

將任何Json解析為鍵值對

[英]Parse any Json into Key value pair

我嘗試使用Fiddler讀取所有的Request和Response,但是在某些情況下,我將請求數據作為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的工作,但

在此處輸入圖片說明

您表示可以接收任何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數據構造為具有key/value對的Dictionary 在這種情況下,您可以直接反序列化為Dictionary 否則,您將必須創建自定義模型以適合您的JSON數據。 使用最適合您的方法! 請注意 ,可以反序列化隨機數據,但是很難確保您的代碼可以處理數據! 有關如何執行此操作,請參閱盧克的答案

如果您希望能夠反序列化任何JSON ,那么您需要反序列化的類型就是dynamic ,而不是Dictionary<string, dynamic>因為這意味着您必須在JSON中具有字符串鍵。

因此,要按要求反序列化任何JSON對象,您需要使用以下代碼:

var json = JsonConvert.DeserializeObject(requestPost);

請記住,JSON可以很簡單:

["bob", "fred"]

由於沒有鍵(字典中的字符串),因此與您的模型不匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM