博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 解析JSON的几种办法
阅读量:7112 次
发布时间:2019-06-28

本文共 4404 字,大约阅读时间需要 14 分钟。

欲成为海洋大师,必知晓海中每一滴水的真名。

刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把。

搜索过程中免不了碰到一大堆名词:WCF => DataContract => DataMember => DataContractJsonSerializer,然后就是不停的引入命名空间。

这一段经历,立即让我就联想到了上面引用的这句存在于某小说里面巫师的话语。静态语言真有点令人抓狂,不停的做准备,然后才可能开始工作。

对比

.NET下几种常见的解析JSON方法
主要类 命名空间 限制 内建LINQ支持
通用
只能在Web环境使用
、、 只能在Silverlight中使用
、、、、 通用

准备数据

实体类:

[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 log = o => Console.WriteLine(o);Func
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;        ///     /// 解析JSON,仿Javascript风格 ///  public static class JSON { public static T parse
(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
() { p1, p2 })); //true log(jsonString); // 反序列化,泛型集合 JSON.parse
>(jsonString); // 数组转换 JSON.parse
(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
() { p1, p2 }); var persons = jser.Deserialize
>(json);

使用Silverlight

// using System.Json        var css = "{ \"#header\" : {background:\"red\"}, layout : [5,4,1],color:\"cyan\" }";        var style = JsonObject.Parse(css) as JsonObject; ( from s in style where 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
>(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 ja where !j["Name"].Value
().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" } }

几个链接:

转载地址:http://wpghl.baihongyu.com/

你可能感兴趣的文章
设计模式之 - 单例模式
查看>>
用 Python 脚本,监听附近网络 Wi-Fi 设备,通过邮件和微信进行消息推送
查看>>
巅峰之证!首位阿里云ACE认证专家产生
查看>>
Spring Cloud Alibaba Sentinel对RestTemplate的支持
查看>>
canvas
查看>>
2018-07-30 到 2018-08-03
查看>>
昨天,我们公司的产品经理被我...
查看>>
【今日头条】【抖音火山】后台开发实习生
查看>>
js文件操作总结一:图片篇
查看>>
外观模式
查看>>
javascript之函数防抖与节流
查看>>
docker 部署前端
查看>>
Spring定时任务的几种实现
查看>>
web前端程序员真的值这么多钱吗?
查看>>
好程序员Java分享JVM结构
查看>>
echarts加轴显示(单位)及标题
查看>>
Java反射 方法 Methods
查看>>
使用工具类DbUtils连接数据库,并简单操作数据库
查看>>
vue/cli3+最全生产环境优化方法
查看>>
日日日日日日日日日日
查看>>