问题:c# json解析;结果:c# 解析JSON的几种办法
c# 解析JSON的几种办法
欲成为海洋大师,必知晓海中每一滴水的真名。
刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把。
搜索过程中免不了碰到一大堆名词:WCF => DataContract => DataMember => DataContractJsonSerializer,然后就是不停的引入命名空间。
这一段经历,立即让我就联想到了上面引用的这句存在于某小说里面巫师的话语。静态语言真有点令人抓狂,不停的做准备,然后才可能开始工作。
对比
| 主要类 | 命名空间 | 限制 | 内建LINQ支持 | 
|---|---|---|---|
| DataContractJsonSerializer | System.Runtime.Serialization.Json | 通用 | 否 | 
| JavaScriptSerializer | System.Web.Script.Serialization | 只能在Web环境使用 | 否 | 
| JsonArray、JsonObject、JsonValue | System.Json | 只能在Silverlight中使用 | 是 | 
| JsonConvert、JArray、JObject、JValue、JProperty | 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解析;结果:c# 解析JSON的几种办法的更多相关文章
- Java中json的构造和解析
		
什么是 Json? JSON(JvaScript Object Notation)(官网网站:http://www.json.org/)是 一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机 ...
 - C# 解析JSON的几种办法
		
欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => DataContract => ...
 - WP8解析JSON格式(使用Newtonsoft.Json包)
		
DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式. 这里举一个简单的解析JSON格式的例子(更多JSON操作): { "response&q ...
 - JSON解析和XML解析对比
		
JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...
 - 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
		
先看一下我要实现的功能界面: 这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面 ...
 - 数据解析(XML和JSON数据结构)
		
一 解析 二 XML数据结构 三 JSON 数据结构 一 解析 1 定义: 从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照 ...
 - 使用 dynamic 标记解析JSON字符串 JDynamic :支持Json反序列化为Dynamic对象
		
使用 dynamic 标记解析JSON字符串 http://www.cnblogs.com/taotaodetuer/p/4171327.html 1 string jsonStr = " ...
 - iOS-数据持久化基础-JSON与XML数据解析
		
解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...
 - (转)c# 解析JSON的几种办法
		
来自:http://blog.csdn.net/gaofang2009/article/details/6073029 欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的 ...
 - Cocos2d-x 3.0 Json用法     Cocos2d-x xml解析
		
Cocos2d-x 3.0 加入了rapidjson库用于json解析.位于external/json下. rapidjson 项目地址:http://code.google.com/p/rapidj ...
 
随机推荐
- bash: .bashrc: command not found
			
解决这个错误需要: vi ~/.bashrc 进入以后把 .bashrc 给注释掉 就不会再报错了.
 - MySQL数据copy
			
摘自http://database.51cto.com/art/201011/234776.htm 1. 下面这个语句会拷贝表结构到新表newadmin中. (不会拷贝表中的数据) CREATE TA ...
 - Intel微处理结构.docx
			
1. 段寄存器 CS(代码段),代码段是一个存储器区域,这里保存微处理器使用的代码(程序和过程).代码段寄存器定义了存放代码的存储器段的起始地址.在实模式下工作时,它定义一个64KB存储器段的起始地址 ...
 - 添加语句<tx:annotation-driven transaction-manager="txManager"/>报错
			
在添加<tx:annotation-driven transaction-manager="txManager"/>程序之前,applicationContext.xm ...
 - python中的列表和字典(二)
			
三. 字典以及相关使用 1. 字典的定义 dict{} 2. 字典特征:字典是无序的,key-value键值对形式,key值不重复 3. 字典的赋值:dictA = {keyA: valueA, ke ...
 - MRC与ARC混合编程的编译器标记
			
如果是MRC项目创建ARC源文件,给这个源文件加上 -fobjc-arc 的编译器标记, 如果是ARC项目创建MRC源文件,给这个源文件加上 -fno-objc-arc 的编译器标记. 步骤: 1. ...
 - SpringBoot WebSocket实现
			
1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
 - Disruptor_学习_00_资源帖
			
一.官方 disruptor-github disruptor-api LMAX Disruptor 二.精选资料 Disruptor入门-官方文档翻译-方腾飞 Disruptor官方文档实现 Dis ...
 - AngularJS-webapp($q)
			
$q延迟加载: 当一个数据需要请求多次,后面一个数据需要前面请求的数据时,我们就可以通过延迟加载进行数据传递 如下代码: 首先:我们需要得到职位信息: { "id": " ...
 - 【SQL查询】查询的值为空时,给出默认值_NVL函数
			
格式为: NVL( string1, replace_with) 功能:如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值. 引申一下,此NVL的作 ...