对比

.NET下几种常见的解析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的几种办法(转载)相关推荐

  1. c# 解析JSON的几种办法

    欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => DataContract => ...

  2. python如何将字符串转换成json的几种办法!

    python如何将字符串转换成json的几种办法 最近在工作中遇到了一个小问题,如果要将字符串型的数据转换成dict类型,我第一时间就想到了使用json函数.但是里面出现了一些问题 1.通过json来 ...

  3. java json 解析_Java解析JSON的四种方式

    一.什么是JSON JSON是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于阅读和编写,同时也易于解析和 ...

  4. java解析json的一种方法

    package com.hanchao.web; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /************* ...

  5. js解析json字符串为json对象,js解析json的6种方法

    1.一种为使用eval()函数. 方式如下: var dataObj=eval("("+data+")"); 为什么要加() 原因在于:eval本身的问题. 由 ...

  6. Android之GSON解析JSON

    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库. 比如: <pre name="code" class=" ...

  7. Delphi XE6 原生解析json

    Delphi XE6 原生解析json (2014-07-22 23:22:35) 转载▼ 标签: it 分类: DelphiXE6 Delphi XE5带了system.json单元,原生提供了js ...

  8. c语言json结构体_C语言解析JSON源码

    2020-01-09 关键字:cJSON.linux JSON解析 JSON 是一种在互联网领域内很常用的轻量级数据交换协议. 它与 XML 的地位差不多,但就笔者而言,笔者更喜欢 JSON 的风格, ...

  9. html5处理json数据,js解析json数组

    js读取解析JSON类型数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 Jav ...

最新文章

  1. Ogre貌似开始推荐MYGUI了~~
  2. android banner阴影,仿照锤子科技官网的banner 3d效果
  3. React事件系统研究总结
  4. gettype拿不到值_王者荣耀:被低估的强势打野,就是这位拿大锤子的阿姨!
  5. eclipse搜索框太小
  6. LwIP之网络技术基础
  7. html如何在网页上看错误,HTML错误时,Spring MVC的,但不能查看网页时,静态
  8. 打孔怎么定位_不粘锅是怎么制造出来的?看完工艺流程真的清楚了「精彩动图」...
  9. pip 指定版本安装
  10. 使用半透明的DIV实现禁用页面功能
  11. mysql如何怎么进行单表的单条数据删除--根据id进行删除
  12. PCB学习笔记——0201 0402 0603 0805 1206焊盘封装尺寸
  13. Fastdb安装与使用
  14. 2020年毕业生腾讯校园招聘提前批——后台开发——面试经验——分享给大家交流经验。
  15. linux查看ssh进程命令,查看linux ssh服务信息及运行状态方法
  16. 优秀网页翻译:高精度 10MHz GPS 驯服钟 (GPSDO) - Part 5
  17. APP设计师必上的10个APP图标素材资源站
  18. fik在计算机领域英语缩写,计算机常用英语词汇表
  19. 数字化与高质量发展之百年大变局下的科技创新--学习王坚院士讲座的记录和读后感
  20. Java 学习笔记 - 数组类型互转

热门文章

  1. nginx css 304 导致图片丢失_Nginx 从入门到实战
  2. 怎么用python判断数据是否已经存在于表里_数据基本操作(二)
  3. java SAX 防xml注入,如何防止XML注入像XML Bomb和XXE攻击
  4. H5-Dooring可视化搭建平台的新技能
  5. 入门单片机需要购买什么东西,学哪款单片机最好?
  6. linux 网络编程 ping,Linux 网络编程基础(4) -- Ping 的C代码实现
  7. php 字符串转时间戳_php如何将时间字符串转换为时间戳
  8. sqlalchemy数据库中的group_by()和order_by()使用
  9. 总结关于map的一些基本用法
  10. poj3007(set的应用)