c# 解析JSON的几种办法(转载)
对比
主要类 | 命名空间 | 限制 | 内建LINQ支持 |
---|---|---|---|
DataContractJsonSerializer | System.Runtime.Serialization.Json | 通用 | 否 |
JavaScriptSerializer | System.Web.Script.Serialization | 只能在Web环境使用 | 否 |
JsonArray、JsonObject、JsonValue | System.Json | 只能在Silverlight中使用 | 是 |
JsonConvert、JArray、JObject、JValue、JProperty | Newtonsoft.Json | 通用 | 是 |
准备数据
实体类:
[DataContract]public class Person{[DataMember(Order = 0, IsRequired = true)]public string Name { get; set; }[DataMember(Order = 1)]public int Age { get; set; }[DataMember(Order = 2)]public bool Alive { get; set; }[DataMember(Order = 3)]public string[] FavoriteFilms { get; set; }[DataMember(Order = 4)]public Person Child { get; set; }}
定义:
Action<object> log = o => Console.WriteLine(o);
Func<int, int, int> add = (x, y) => x + y;var p1 = new Person {Age = 12,Alive = true,Name = "lj",FavoriteFilms = new[] { "Up", "Avatar" }
};
var p2 = new Person() { Age = 28, Name = "cy", Child = p1 };
使用DataContractJsonSerializer
帮助类:
// using System.Runtime.Serialization.Json;/// <summary>/// 解析JSON,仿Javascript风格/// </summary>public static class JSON{public static T parse<T>(string jsonString){using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString))){return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);}}public static string stringify(object jsonObject){using (var ms = new MemoryStream()){new DataContractJsonSerializer(jsonObject.GetType()).WriteObject(ms, jsonObject);return Encoding.UTF8.GetString(ms.ToArray());}}}
用法:
// 序列化var jsonString = JSON.stringify(new[] { p1, p2 });log(jsonString == JSON.stringify(new List<Person>() { p1, p2 })); //truelog(jsonString);// 反序列化,泛型集合JSON.parse<List<Person>>(jsonString);// 数组转换 JSON.parse<Person[]>(jsonString);
输出:
[{"Name":"lj","Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null
},{"Name":"cy","Age":28,"Alive":false,"FavoriteFilms":null,"Child":{"Name":"lj",
"Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null}}]
使用JavaScriptSerializer
// using System.Web.Script.Serialization;var jser = new JavaScriptSerializer();var json = jser.Serialize(new List<Person>() { p1, p2 });var persons = jser.Deserialize<List<Person>>(json);
使用Silverlight
// using System.Jsonvar css = "{ \"#header\" : {background:\"red\"}, layout : [5,4,1],color:\"cyan\" }";var style = JsonObject.Parse(css) as JsonObject; (from s in stylewhere s.Key == "color"select (string)s.Value).First().ToString(); // "cyan"// 更多操作style["layout"][0] = 22;var hd = style["#header"];style["body>div+p"] = hd;style.Remove("#header");var bd = new JsonObject();bd["border"] = "1px solid cyan";style["body>div+p"]["#meta"] = bd;style.ToString(); // {"layout":[22,4,1],"color":"cyan","body>div+p":{"background":"red","#meta":{"border":"1px solid cyan"}}}
使用JSON.NET
// using Newtonsoft.Json;var json = JsonConvert.SerializeObject(new[] { p1, p2 });var persons = JsonConvert.DeserializeObject<List<Person>>(json);var ja = JArray.Parse(jsonString); log(ja); //注意,格式化过的输出
输出:
[{"Name": "lj","Age": 12,"Alive": true,"FavoriteFilms": ["Up","Avatar"],"Child": null},{"Name": "cy","Age": 28,"Alive": false,"FavoriteFilms": null,"Child": {"Name": "lj","Age": 12,"Alive": true,"FavoriteFilms": ["Up","Avatar"],"Child": null}}
]
LINQ:
var ageCount = ja.Select(j => (int)j["Age"]).Aggregate(add); var q = from j in jawhere !j["Name"].Value<string>().Equals("lj")select (int)j["Age"];log(q.Aggregate(add) == ageCount); //false
其他:
// 与Linq to XML 相似的嵌套构造函数:var jo = new JObject(new JProperty("age", persons.Select( p => p.Age)),new JProperty("funny", true),new JProperty("array", new JArray(new[] { 2, 4, 1 })));log(jo);// JObject 操作var css = "{ \"#header\" : {background:\"red\"}, layout : [5,4,1] }";var style = JObject.Parse(css);var bd = new JObject();bd["color"] = "1px solid cyan";style["border"] = bd;var hd = style["#header"];style["body>div+p"] = hd;hd.Parent.Remove();style["layout"][0] = 22;log(style);
输出:
{"age": [12,28],"funny": true,"array": [2,4,1]}{"layout": [22,4,1],"border": {"color": "1px solid cyan"},"body>div+p": {"background": "red"}}
几个链接:
- 独立 JSON 序列化
- 如何:对 JSON 数据进行序列化和反序列化
- Json.NET
- JSONLint
- BSON
c# 解析JSON的几种办法(转载)相关推荐
- c# 解析JSON的几种办法
欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => DataContract => ...
- python如何将字符串转换成json的几种办法!
python如何将字符串转换成json的几种办法 最近在工作中遇到了一个小问题,如果要将字符串型的数据转换成dict类型,我第一时间就想到了使用json函数.但是里面出现了一些问题 1.通过json来 ...
- java json 解析_Java解析JSON的四种方式
一.什么是JSON JSON是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于阅读和编写,同时也易于解析和 ...
- java解析json的一种方法
package com.hanchao.web; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /************* ...
- js解析json字符串为json对象,js解析json的6种方法
1.一种为使用eval()函数. 方式如下: var dataObj=eval("("+data+")"); 为什么要加() 原因在于:eval本身的问题. 由 ...
- Android之GSON解析JSON
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库. 比如: <pre name="code" class=" ...
- Delphi XE6 原生解析json
Delphi XE6 原生解析json (2014-07-22 23:22:35) 转载▼ 标签: it 分类: DelphiXE6 Delphi XE5带了system.json单元,原生提供了js ...
- c语言json结构体_C语言解析JSON源码
2020-01-09 关键字:cJSON.linux JSON解析 JSON 是一种在互联网领域内很常用的轻量级数据交换协议. 它与 XML 的地位差不多,但就笔者而言,笔者更喜欢 JSON 的风格, ...
- html5处理json数据,js解析json数组
js读取解析JSON类型数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 Jav ...
最新文章
- Ogre貌似开始推荐MYGUI了~~
- android banner阴影,仿照锤子科技官网的banner 3d效果
- React事件系统研究总结
- gettype拿不到值_王者荣耀:被低估的强势打野,就是这位拿大锤子的阿姨!
- eclipse搜索框太小
- LwIP之网络技术基础
- html如何在网页上看错误,HTML错误时,Spring MVC的,但不能查看网页时,静态
- 打孔怎么定位_不粘锅是怎么制造出来的?看完工艺流程真的清楚了「精彩动图」...
- pip 指定版本安装
- 使用半透明的DIV实现禁用页面功能
- mysql如何怎么进行单表的单条数据删除--根据id进行删除
- PCB学习笔记——0201 0402 0603 0805 1206焊盘封装尺寸
- Fastdb安装与使用
- 2020年毕业生腾讯校园招聘提前批——后台开发——面试经验——分享给大家交流经验。
- linux查看ssh进程命令,查看linux ssh服务信息及运行状态方法
- 优秀网页翻译:高精度 10MHz GPS 驯服钟 (GPSDO) - Part 5
- APP设计师必上的10个APP图标素材资源站
- fik在计算机领域英语缩写,计算机常用英语词汇表
- 数字化与高质量发展之百年大变局下的科技创新--学习王坚院士讲座的记录和读后感
- Java 学习笔记 - 数组类型互转
热门文章
- nginx css 304 导致图片丢失_Nginx 从入门到实战
- 怎么用python判断数据是否已经存在于表里_数据基本操作(二)
- java SAX 防xml注入,如何防止XML注入像XML Bomb和XXE攻击
- H5-Dooring可视化搭建平台的新技能
- 入门单片机需要购买什么东西,学哪款单片机最好?
- linux 网络编程 ping,Linux 网络编程基础(4) -- Ping 的C代码实现
- php 字符串转时间戳_php如何将时间字符串转换为时间戳
- sqlalchemy数据库中的group_by()和order_by()使用
- 总结关于map的一些基本用法
- poj3007(set的应用)