欲成为海洋大师,必知晓海中每一滴水的真名。
刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把。
搜索过程中免不了碰到一大堆名词:WCF => DataContract => DataMember => DataContractJsonSerializer,然后就是不停的引入命名空间。
这一段经历,立即让我就联想到了上面引用的这句存在于某小说里面巫师的话语。静态语言真有点令人抓狂,不停的做准备,然后才可能开始工作。
对比
DataContractJsonSerializer
System.Runtime.Serialization.Json
通用
否
JavaScriptSerializer
System.Web.Script.Serialization
只能在Web环境使用
否
JsonArray、JsonObject、JsonValue
System.Json
只能在Silverlight中使用
是
JsonConvert、JArray、JObject、JValue、JProperty
Newtonsoft.Json
通用
是
准备数据
实体类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 1[DataContract]
2 public class Person
3 {
4 [DataMember(Order = 0, IsRequired = true)]
5 public string Name { get; set; }
6
7 [DataMember(Order = 1)]
8 public int Age { get; set; }
9
10 [DataMember(Order = 2)]
11 public bool Alive { get; set; }
12
13 [DataMember(Order = 3)]
14 public string[] FavoriteFilms { get; set; }
15
16 [DataMember(Order = 4)]
17 public Person Child { get; set; }
18 }
19
定义:
1
2
3
4
5
6
7
8
9
10
11 1Action<object> log = o => Console.WriteLine(o);
2Func<int, int, int> add = (x, y) => x + y;
3
4var p1 = new Person {
5 Age = 12,
6 Alive = true,
7 Name = "lj",
8 FavoriteFilms = new[] { "Up", "Avatar" }
9};
10var p2 = new Person() { Age = 28, Name = "cy", Child = p1 };
11
使用DataContractJsonSerializer
帮助类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 1// using System.Runtime.Serialization.Json;
2
3 /// <summary>
4 /// 解析JSON,仿Javascript风格
5 /// </summary>
6 public static class JSON
7 {
8
9 public static T parse<T>(string jsonString)
10 {
11 using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
12 {
13 return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);
14 }
15 }
16
17 public static string stringify(object jsonObject)
18 {
19 using (var ms = new MemoryStream())
20 {
21 new DataContractJsonSerializer(jsonObject.GetType()).WriteObject(ms, jsonObject);
22 return Encoding.UTF8.GetString(ms.ToArray());
23 }
24 }
25 }
26
用法:
1
2
3
4
5
6
7
8
9 1// 序列化
2 var jsonString = JSON.stringify(new[] { p1, p2 });
3 log(jsonString == JSON.stringify(new List<Person>() { p1, p2 })); //true
4 log(jsonString);
5 // 反序列化,泛型集合
6 JSON.parse<List<Person>>(jsonString);
7 // 数组转换
8 JSON.parse<Person[]>(jsonString);
9
输出:
1
2
3
4 1[{"Name":"lj","Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null
2},{"Name":"cy","Age":28,"Alive":false,"FavoriteFilms":null,"Child":{"Name":"lj",
3"Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null}}]
4
使用JavaScriptSerializer
1
2
3
4
5
6 1// using System.Web.Script.Serialization;
2
3 var jser = new JavaScriptSerializer();
4 var json = jser.Serialize(new List<Person>() { p1, p2 });
5 var persons = jser.Deserialize<List<Person>>(json);
6
使用Silverlight
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 1// using System.Json
2
3 var css = "{ \"#header\" : {background:\"red\"}, layout : [5,4,1],color:\"cyan\" }";
4
5 var style = JsonObject.Parse(css) as JsonObject;
6
7 (
8 from s in style
9 where s.Key == "color"
10 select (string)s.Value
11 ).First().ToString();
12 // "cyan"
13
14
15 // 更多操作
16 style["layout"][0] = 22;
17
18 var hd = style["#header"];
19 style["body>div+p"] = hd;
20 style.Remove("#header");
21
22 var bd = new JsonObject();
23 bd["border"] = "1px solid cyan";
24 style["body>div+p"]["#meta"] = bd;
25 style.ToString();
26 // {"layout":[22,4,1],"color":"cyan","body>div+p":{"background":"red","#meta":{"border":"1px solid cyan"}}}
27
使用JSON.NET
1
2
3
4
5
6
7 1// using Newtonsoft.Json;
2
3 var json = JsonConvert.SerializeObject(new[] { p1, p2 });
4 var persons = JsonConvert.DeserializeObject<List<Person>>(json);
5 var ja = JArray.Parse(jsonString);
6 log(ja); //注意,格式化过的输出
7
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 1[
2 {
3 "Name": "lj",
4 "Age": 12,
5 "Alive": true,
6 "FavoriteFilms": [
7 "Up",
8 "Avatar"
9 ],
10 "Child": null
11 },
12 {
13 "Name": "cy",
14 "Age": 28,
15 "Alive": false,
16 "FavoriteFilms": null,
17 "Child": {
18 "Name": "lj",
19 "Age": 12,
20 "Alive": true,
21 "FavoriteFilms": [
22 "Up",
23 "Avatar"
24 ],
25 "Child": null
26 }
27 }
28]
29
LINQ:
1
2
3
4
5
6
7 1var ageCount = ja.Select(j => (int)j["Age"]).Aggregate(add);
2 var q = from j in ja
3 where !j["Name"].Value<string>().Equals("lj")
4 select (int)j["Age"];
5
6 log(q.Aggregate(add) == ageCount); //false
7
其他:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 1// 与Linq to XML 相似的嵌套构造函数:
2 var jo = new JObject(
3 new JProperty("age", persons.Select( p => p.Age)),
4 new JProperty("funny", true),
5 new JProperty("array", new JArray(new[] { 2, 4, 1 }))
6 );
7 log(jo);
8
9 // JObject 操作
10 var css = "{ \"#header\" : {background:\"red\"}, layout : [5,4,1] }";
11 var style = JObject.Parse(css);
12
13 var bd = new JObject();
14 bd["color"] = "1px solid cyan";
15
16 style["border"] = bd;
17
18 var hd = style["#header"];
19 style["body>div+p"] = hd;
20
21 hd.Parent.Remove();
22
23 style["layout"][0] = 22;
24 log(style);
25
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 1{
2 "age": [
3 12,
4 28
5 ],
6 "funny": true,
7 "array": [
8 2,
9 4,
10 1
11 ]
12 }
13 {
14 "layout": [
15 22,
16 4,
17 1
18 ],
19 "border": {
20 "color": "1px solid cyan"
21 },
22 "body>div+p": {
23 "background": "red"
24 }
25 }
26
1
2 1
2
1
2 1转自:http://www.cnblogs.com/ambar/archive/2010/07/13/parse-json-via-csharp.html
2