http://www.cnblogs.com/ambar/archive/2010/07/13/parse-json-via-csharp.html

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

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

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

对比

.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"
}
}

几个链接:

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

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

对比

.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的几种办法(转载)

    对比 .NET下几种常见的解析JSON方法 主要类 命名空间 限制 内建LINQ支持 DataContractJsonSerializer System.Runtime.Serialization.J ...

  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. Effective C++笔记:设计与声明

    条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容. ...

  2. sql server系统表详细说明

    sysaltfiles  主数据库 保存数据库的文件 syscharsets  主数据库字符集与排序顺序 sysconfigures 主数据库 配置选项 syscurconfigs 主数据库当前配置选 ...

  3. Linphone iOS客户端编译时打开G729支持

    Assuming you were able to compile the SDK and the linphone XCode project, here is what you need to d ...

  4. POJ2047 Concert Hall Scheduling(最小费用最大流)

    题目大概是有两个音乐厅,有n个乐队申请音乐厅,他们必须从第ii天到第ji天连续开音乐会且他们的开价是wi,每天每个音乐厅都只能供一个乐队进行音乐会.问接受哪些乐队的申请,获利最多能多少. 这题相当于在 ...

  5. bzoj1030 [JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2654  Solved: 1100[Submit][Stat ...

  6. 使用 Java 开发并生成 .jar 文件

    1. 编写文件 D:\test\Hello.java: package test; public class Hello { public static void main(String argv[] ...

  7. c# 使用GetOleDbSchemaTable获取access数据库结构

    c# 使用GetOleDbSchemaTable获取access数据库结构 ado.net可以使用GetOleDbSchemaTable方法来获取access数据库的结构,但得到的datatable的 ...

  8. cJSON应用举例

    //在网上查了不少cJSON,结果只找到c语言字符串转换到JSON的实例,想转回来结果没有实例.自己琢磨了一个下午才敢下手.下面把转来转去的代码贴上. //百度网盘的 CJSON 实例源码 地址 ht ...

  9. Spring整合Quartz实现持久化、动态设定时间

    一.spring整合 网上一搜有很多整合的方式,这里我采用了其中的一种(暂时还没有对其他的方法研究过). 对于spring的整合其中的任务,spring提供了几个类.接口(这些类都实现了Job接口): ...

  10. Qt中图像的显示与基本操作

    Qt可显示基本的图像类型,利用QImage.QPxmap类可以实现图像的显示,并且利用类中的方法可以实现图像的基本操作(缩放.旋转). 1. Qt可显示的图像类型 参考Qt的帮助文档,可支持的类型,即 ...