2017-04-21 62 views
0

我嘗試使用Fiddler讀取所有請求和響應,但在某些情況下,我將請求數據作爲JSON獲取,並且我想將該JSON解析爲鍵值對。將任何Json解析爲Key值對

我已經試過這樣

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

+0

請你可以告訴我們'requestPost'看起來像什麼嗎? – Luke

+0

@Luke requestpost可能是任何json .. –

+0

如果你的JSON真的可以是任何東西,那麼「[我如何使用JSON.NET反序列化爲嵌套/遞歸Dictionary和List?](http://stackoverflow.com/q/5546142/10263)「可能對你有幫助。但請注意,並非每個JSON都可以被解析爲鍵值對。如果你從一個JSON數組開始,那麼當你解析它時你會得到一個列表。 –

回答

1

如果你希望能夠反序列化任何JSON,那麼你需要反序列化的類型只是dynamic,而不是Dictionary<string, dynamic>,因爲這意味着你必須在你的JSON中有一個字符串鍵......

因此,反序列化任何JSON對象,的要求,你需要使用的代碼:記住

var json = JsonConvert.DeserializeObject(requestPost); 

軸承是JSON可以是簡單的:

["bob", "fred"] 

哪不符合你的模型,因爲沒有鍵(字典中的字符串)。

0

您表示您可以收到任何JSON。但是,這將導致嚴重的挑戰,因爲您仍然需要解析數據以便以某種結構化的方式使用它。因此,你應該確保你總是得到一個類似的輸入。我會給你最適合的選擇。

選項1:解串行JSONDictionary只有當你的數據如下key/value佈局工作。所以佈局應該總是這樣:

{ 
    "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關於如何做到這一點。