含有動態未知字段的 JSON 反序列化

一般來說,正常的 json 長這個模樣:

{
  'Name': 'Bad Boys',
  'ReleaseDate': '1995-4-7T00:00:00',
  'Genres': [
    'Action',
    'Comedy'
  ]
}

 

這個時候我們只需要建立對應的類,直接反序列化就行(比如宇宙第一VS的 “編輯” -- “選擇性粘貼” -- “將JSON粘貼爲類”)

    public class Movie
    {
        public string Name { get; set; }
        public string ReleaseDate { get; set; }
        public string[] Genres { get; set; }
    }

    Movie m = JsonConvert.DeserializeObject<Movie>(json);

 

不過有的時候會有些不負責任的 JSON

有時候它長這樣:

{
	"mapping": [{
		"PHARMACOLOGY": "TU",
		"NEUROSCIENCES": "RU"
	}]
}

 

有時候它還長這樣:

{
	"mapping": [{
		"TELECOMMUNICATIONS": "YE"
	}]
}

 

這個時候序列化我們就需要 字典 (Dictionary)

這個時候我們的類要長這樣:

    public class Rootobject
    {
        public List<Dictionary<string, string>> mapping { get; set; }
    }

 

然後照常反序列化:

Rootobject root = JsonConvert.DeserializeObject<Rootobject>(JSON);

 

循環下輸出結果:

                        i++;
                        foreach (var temp in root.mapping[0])
                        {
                            Console.WriteLine(String.Format("Number:{0},Keys:{1},Values:{2}", i, temp.Key, temp.Value));
                        }

 

結果如下:

image

 

如果更麻煩一點的呢?

比如我在 https://blog.csdn.net/jdsjlzx/article/details/76785239 看到的這個json:

{
	"resultcode": "200",
	"reason": "successed!",
	"result": {
		"sk": {
			"temp": "24",
			"wind_direction": "東北風",
			"wind_strength": "2級",
			"humidity": "28%",
			"time": "17:38"
		},
		"today": {
			"temperature": "15℃~26℃",
			"weather": "多雲轉晴",
			"wind": "東北風微風",
			"week": "星期日",
			"city": "桂林",
			"date_y": "2015年10月11日",
			"dressing_index": "舒適",
			"dressing_advice": "建議着長袖T恤、襯衫加單褲等服裝。年老體弱者宜着針織長袖襯衫、馬甲和長褲。",
			"uv_index": "",
			"comfort_index": "",
			"wash_index": "較適宜",
			"travel_index": "較適宜",
			"exercise_index": "較適宜",
			"drying_index": ""
		},
		"future": {
			"day_20151011": {
				"temperature": "15℃~26℃",
				"weather": "多雲轉晴",
				"wind": "東北風微風",
				"week": "星期日",
				"date": "20151011"
			},
			"day_20151012": {
				"temperature": "16℃~27℃",
				"weather": "晴轉多雲",
				"wind": "微風",
				"week": "星期一",
				"date": "20151012"
			},
			"day_20151013": {
				"temperature": "16℃~26℃",
				"weather": "多雲轉晴",
				"wind": "微風",
				"week": "星期二",
				"date": "20151013"
			},
			"day_20151014": {
				"temperature": "17℃~27℃",
				"weather": "",
				"wind": "北風微風",
				"week": "星期三",
				"date": "20151014"
			},
			"day_20151015": {
				"temperature": "17℃~28℃",
				"weather": "",
				"wind": "北風微風",
				"week": "星期四",
				"date": "20151015"
			},
			"day_20151016": {
				"temperature": "17℃~30℃",
				"weather": "",
				"wind": "北風微風",
				"week": "星期五",
				"date": "20151016"
			},
			"day_20151017": {
				"temperature": "17℃~30℃",
				"weather": "",
				"wind": "北風微風",
				"week": "星期六",
				"date": "20151017"
			}
		}
	},
	"error_code": 0
}

 

繼續使用 Dictionary 定義類:

    public class WeatherRootobject
    {
        public string resultcode { get; set; }
        public string reason { get; set; }
        public Result result { get; set; }
        public int error_code { get; set; }
    }

    public class Result
    {
        public Sk sk { get; set; }
        public Today today { get; set; }
        public Dictionary<string, Weather> future { get; set; }
    }

    public class Sk
    {
        public string temp { get; set; }
        public string wind_direction { get; set; }
        public string wind_strength { get; set; }
        public string humidity { get; set; }
        public string time { get; set; }
    }

    public class Today
    {
        public string temperature { get; set; }
        public string weather { get; set; }
        public string wind { get; set; }
        public string week { get; set; }
        public string city { get; set; }
        public string date_y { get; set; }
        public string dressing_index { get; set; }
        public string dressing_advice { get; set; }
        public string uv_index { get; set; }
        public string comfort_index { get; set; }
        public string wash_index { get; set; }
        public string travel_index { get; set; }
        public string exercise_index { get; set; }
        public string drying_index { get; set; }
    }

    public class Weather
    {
        public string temperature { get; set; }
        public string weather { get; set; }
        public string wind { get; set; }
        public string week { get; set; }
        public string date { get; set; }
    }

 

然後反序列化輸出:

            WeatherRootobject weathers = JsonConvert.DeserializeObject<WeatherRootobject>(json);
            foreach (var temp in weathers.result.future)
            {
                Console.WriteLine(String.Format("Day:{0},Week:{1},Temperature:{2}",  temp.Key, temp.Value.week, temp.Value.temperature));
            }

 

結果如下:

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章