C# 解析 key 值動(dòng)態(tài)的 json 數(shù)據(jù)
背景
之前在對(duì)接第三方的api的時(shí)候,對(duì)方給的數(shù)據(jù)格式是這樣的json
就是沒有字段屬性這一說 ,都是數(shù)據(jù),而且格式還是不固定的。
第一眼看到這東西,心里第一反應(yīng)是想罵人,但是沒辦法,睡覺人家是大爺。
那就的想辦法解析成我們看得懂的數(shù)據(jù)。
思路
仔細(xì)觀察發(fā)現(xiàn),鍵值對(duì)的規(guī)律是第一個(gè)字段是string 類型,但是第二個(gè)是對(duì)象類型。加上沒有字段名稱。所以第一想到的是Dictionary。
下面看下Dictionary特性:
- 必須包含名空間System.Collection.Generic
- Dictionary里面的每一個(gè)元素都是一個(gè)鍵值對(duì)(由二個(gè)元素組成:鍵和值)
- 鍵必須是唯一的,而值不需要唯一的
- 鍵和值都可以是任何類型(比如:string, int, 自定義類型,等等)
- 通過一個(gè)鍵讀取一個(gè)值的時(shí)間是接近O(1)
- 鍵值對(duì)之間的偏序可以不定義
所以對(duì)應(yīng)的c# 類型是Dictionary<string, dynamic>>。
眼見為實(shí),那么接下來我們來驗(yàn)證下是否可行。
(1) nuget引用 using Newtonsoft.Json;
(2) 準(zhǔn)備一段數(shù)據(jù)
{
"r545454aa":"gfgf方(rttr)",
"111":"機(jī)trtrrt",
"rrr":"2022-02-11",
"tt":[
"ghhg",
"nbbn"
],
"545454":"fdfdfd"
}
(3) 解析 JsonConvert.DeserializeObject<Dictionary<string, dynamic>>
private string Convertjson(string jsonStr)
{
var model = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonStr);
List<QAModel> list = new List<QAModel>();
foreach (var item in model)
{
。。。。。。。。。。。。
}
}
(4) 到這里我們測試發(fā)現(xiàn),數(shù)據(jù)正常解析了,接下來我們就是對(duì)dynamic進(jìn)行再次解析了。
if (item.Value is string)
{
Text = item.Value;
}
else
{
。。。。。。。。。。。。。
}
到此,問題解決。