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

如果更麻烦一点的呢?
比如我在 https://blog.csdn.net/jdsjlzx/article/details/76785239 看到的这个json:
{
"resultcode": "",
"reason": "successed!",
"result": {
"sk": {
"temp": "",
"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": ""
},
"day_20151012": {
"temperature": "16℃~27℃",
"weather": "晴转多云",
"wind": "微风",
"week": "星期一",
"date": ""
},
"day_20151013": {
"temperature": "16℃~26℃",
"weather": "多云转晴",
"wind": "微风",
"week": "星期二",
"date": ""
},
"day_20151014": {
"temperature": "17℃~27℃",
"weather": "晴",
"wind": "北风微风",
"week": "星期三",
"date": ""
},
"day_20151015": {
"temperature": "17℃~28℃",
"weather": "晴",
"wind": "北风微风",
"week": "星期四",
"date": ""
},
"day_20151016": {
"temperature": "17℃~30℃",
"weather": "晴",
"wind": "北风微风",
"week": "星期五",
"date": ""
},
"day_20151017": {
"temperature": "17℃~30℃",
"weather": "晴",
"wind": "北风微风",
"week": "星期六",
"date": ""
}
}
},
"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 反序列化的更多相关文章
- java对象中含有Integer类型字段转json字符串问题
问题:对于含有Integer类型字段的java对象,在通过下面这种方式转为json字符串时,Integer类型的字段如果为空的情况下,会默认转化为0,但是我想让它为空的时候直接转化为null,不要默认 ...
- C#动态实体集的反序列化(动态JSON反序列化)
一.使用场景 我们在将 JSON 反序列化实体集的时候,如果字段是固定的,那么我们序列化非常简单,对应字段写的实体集就可以了.比如下面这种: { "data":[ { " ...
- C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone
C# Json反序列化 Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...
- C#在Json反序列化中处理键的特殊字符
假设有如下Json 数据: 1.{ 2."id" : 1, 3."@value" : "this a @", 4."$p" ...
- Sql动态添加字段的正确姿势
如何给指定表动态添加字段? 一.创建一张表[Tbl_AutoFileds] (tableName表名,fieldName字段名,dataType数据类型,length长度 isnull 是否允许为n ...
- odoo 动态创建字段的方法
动态创建字段并非一个常见的的需求,但某些情况下,我们确实又需要动态地创建字段. Odoo 中创建字段的方法有两种,一种是通过python文件class中进行定义,另一种是在界面上手工创建,odoo通过 ...
- Dynamic CRM 2013学习笔记(二十八)用JS动态设置字段的change事件、必填、禁用以及可见
我们知道通过界面设置字段的change事件,是否是必填,是否可见非常容易.但有时我们需要动态地根据某些条件来设置,这时有需要通过js来动态地控制了. 下面分别介绍如何用js来动态设置. 一.动态设 ...
- C# Json反序列化处理
最近换工作了 从客户端转到Web端 第一个任务就是去别人的页面上抓取数据 用到的是JSON 因为他们网站json的格式有点怪 所以 就在JSON反序列化上面 花了一点时间 首先用到的工具是http:/ ...
- 利用DreamweaverCS5制作一个含有动态标题的教程
DreamweaverCS5怎么制作一个含有动态标题?做一个网页就先要做一个标题,一个好标题会让网页让人印象深刻,有动态的标题会让网页更生动,下面我就介绍一下怎么制作一个含有动态的标题 做一个网页 ...
随机推荐
- linux服务器NAT后无法在内网通过外部IP访问内部服务的问题
场景一: 将外网访问192.168.100.10的80端口转发到192.168.75.5:8000端口. # iptables -t nat -A PREROUTING -d 192.168.100. ...
- 剑指offer 6:链表(从头到尾打印链表)
链表的数据结构 struct ListNode { int value; ListNode* next; }; 那么在链表的末尾添加一个节点的代码如下: void insert(ListNode** ...
- 我是sb
哪能倒在这? 细节很多的题怎么写????sb 考完再也不学了,太jb痛苦了. 总因为一些奇奇怪怪的原因导致我
- http 默认端口
80是http协议的默认端口,是在输入网站的时候其实浏览器(非IE)已经帮你输入协议了,所以你输入http://baidu.com,其实是访问http://baidu.com:80.而8080,一般用 ...
- 透彻的掌握 Spring 中@transactional 的使用
事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编码式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...
- TaskTimer
什么是调度 任务:就是事情 调度:在不同的时间点或者在指定的时间点或者间隔多长时间去运行这个任务.就是生活中的闹钟 相关的类Timer 类:位于 java.util 包中 案例 实现时间的动态刷新 任 ...
- [ARM-Linux]Linux-MATLAB安装
说明 网上关于caffe的安装教程非常多,但是关于每一步是否操作成功,出现了什么样的错误又该如何处理没有给出说明.因为大家的操作系统的环境千差万别,按照博客中的教程一步步的安装,最后可能失败--这是很 ...
- docker 学习操作记录 4
记录3 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+Alt ...
- Git/SVN提交代码规范
feat - 新功能 feature fix - 修复 bug docs - 文档注释 style - 代码格式(不影响代码运行的变动) refactor - 重构.优化(既不增加新功能,也不是修复b ...
- Linux下常用目录有哪些?分别有什么作用?
/boot:这个目录是用来存放与系统启动相关的文件 /root:root用户的家目录 /bin:存放大部分的二进制的可执行文件,也就是大部分的linux命令. /tmp:这个文件目录一般是公共的,也就 ...