含有动态未知字段的 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));
                        }

 

结果如下:

含有动态未知字段的 JSON 反序列化

 

如果更麻烦一点的呢?

比如我在 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));
            }

 

结果如下:

含有动态未知字段的 JSON 反序列化

给TA打赏
共{{data.count}}人
人已打赏
随笔日记

RabbitMQ指南之四:路由(Routing)和直连交换机(Direct Exchange)

2020-11-9 4:42:11

随笔日记

我司使用了六年的分布式锁

2020-11-9 4:42:13

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索