c# 解析JSON的几种办法

释放双眼,带上耳机,听听看~!

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

刚开始只是想找一个转换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

2

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

给TA打赏
共{{data.count}}人
人已打赏
安全技术

详解Node.js API系列 Crypto加密模块(1)

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索