对比

.NET下几种常见的解析JSON方法
主要类 命名空间 限制 内建LINQ支持
DataContractJsonSerializer System.Runtime.Serialization.Json 通用
JavaScriptSerializer System.Web.Script.Serialization 只能在Web环境使用
JsonArrayJsonObjectJsonValue System.Json 只能在Silverlight中使用
JsonConvertJArrayJObjectJValueJProperty 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 })); //true
log(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.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<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 ja
where !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"
}
}

几个链接:

c# 解析JSON的几种办法(转载)的更多相关文章

  1. 问题:c# json解析;结果:c# 解析JSON的几种办法

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

  2. C# 解析JSON的几种办法

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

  3. (转)c# 解析JSON的几种办法

    来自:http://blog.csdn.net/gaofang2009/article/details/6073029 欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的 ...

  4. 【转】c# 解析JSON的几种办法

    http://www.cnblogs.com/ambar/archive/2010/07/13/parse-json-via-csharp.html 刚开始只是想找一个转换JSON数组的方法,结果在M ...

  5. 解析JSON的两种方法eval()和JSON.parse()

    解析JSON 一种方法是使用eval函数. var dataObj = eval("("+json+")"); 必须把文本包围在括号中,这样才能避免语法错误,迫 ...

  6. Golang解析json的几种方法

    Golang解析json的几种方法 概要 使用Golang调用其它平台API接口时总会被多层的json串给恶心到,我记录一下自己解析json的几种方法. 一.自带的json包 func JsonUnm ...

  7. go 中解析JSON的三种姿势

    背景 这是一篇写给0-1年新人的文章,短平快的教会你如何解析json字符串. 示例Json 假设有如下json字符串: { "userName":"admin" ...

  8. 解析JSON的三种方式

    JSONObject   JSONObject jsonObject = new JSONObject(strJson); JSONArray jsonArray = jsonObject.getJS ...

  9. unity解析json的两种方式

    一直比较钟情于json,用来做数据交互,堪称完美!下面简单说一下unity使用C#脚本如何解析json数据吧. 一.写解析类,借助于JsonUtility.FromJson 直接给个例子吧 1.jso ...

随机推荐

  1. An Introduction to Interactive Programming in Python (Part 1) -- Week 2_2 练习

    #Practice Exercises for Logic and Conditionals # Solve each of the practice exercises below. # 1.Wri ...

  2. Android中对JSONArray数组的指定项进行删除,更新。

    首先假设有这么一个JSONArray JSONArray Array1;JSONArray ITEM = new JSONArray(); name为你获取要删除的字段名称,IETM就是你删除后得到的 ...

  3. 20135316王剑桥 linux第二周课实验笔记

    Linux中命令格式为: command [options选项] [arguments参数] //中括号代表是可选的,即有些命令不需要选项也不需要参数 ls或ls .显示是当前目录的内容,这里“.”就 ...

  4. app:发布新版本的具体步骤

    1

  5. UIPasteboard的使用

    剪贴板的使用以及自定义剪贴板. 系统剪贴板的直接调用 其实整个过程非常的简单,我就用我写的一个自定义UILable来说明调用系统剪贴板. 首先,因为苹果只放出来了 UITextView,UITextF ...

  6. php 正则表达式捕获组与非捕获组

    熟练掌握正则表达式是每个程序员的基础要求,对于每个初学者来说会被正则表达式一连串字符弄得头晕眼花.博主便会如此,一直对正则表达式有种莫名的恐惧.近来看到另一位博友写的 <php正则表达式> ...

  7. python3 入门 (三) 函数与lambda表达式、闭包

    函数 是组织好的.可重复使用的.用来实现单一或相关联功能的代码段. 函数代码块以def关键词开头,后接函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数 函 ...

  8. linux下安装openssh-server

    csdn博文地址:linux下安装openssh-server   点击进入 系统是ubuntu14.04,系统默认安装了openssh-client,但没有安装openssh-server,需要手动 ...

  9. 第十章:Javascript子集和扩展

    本章讨论javascript的集和超集,其中子集的定义大部分处于安全考虑.只有使用这门语言的一个安全的子集编写脚本,才能让代码执行的更安全.更稳定.ECMScript3标准是1999年版本的,10年后 ...

  10. 第十四章 校本化CSS

    CSS(层叠样式表)是一种指定HTML文档视觉的表现的标准.CSS本来是让视觉设计师来使用的:它允许设计师精确的对文档元素的字体 ,颜色,外边距,缩进,边框甚至是定位.不过,客户端javascript ...