zoukankan      html  css  js  c++  java
  • 含有动态未知字段的 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

  • 相关阅读:
    C#代码中函数调用相关问题
    C#语言编写代码时常用的三大循环
    c#语言中的类型转换
    tesseract_vs2015工具包使用
    Halcon除法
    halcon批量读取图片
    halcon分离路径名称
    Halcon旋转图片的研究
    关于Haclon使用GPU加速的代码实例
    OpenCV代码:画出轮廓的外接矩形,和中心点
  • 原文地址:https://www.cnblogs.com/sun8134/p/10801848.html
Copyright © 2011-2022 走看看