来自:http://blog.csdn.net/gaofang2009/article/details/6073029

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

刚开始只是想找一个转换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 = , IsRequired = true)] 
        public string Name { get; set; } 
 
        [DataMember(Order = )] 
        public int Age { get; set; } 
 
        [DataMember(Order = )] 
        public bool Alive { get; set; } 
 
        [DataMember(Order = )] 
        public string[] FavoriteFilms { get; set; } 
 
        [DataMember(Order = )] 
        public Person Child { get; set; } 
    } 
定义:
Action<object> log = o => Console.WriteLine(o); 
Func<intintint> add = (x, y) => x + y; 
 
var p1 = new Person { 
    Age = , 
    Alive = true
    Name = "lj", 
    FavoriteFilms = new[] { "Up", "Avatar" } 
}; 
var p2 = new Person() { Age = , 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":,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null 
},{"Name":"cy","Age":,"Alive":false,"FavoriteFilms":null,"Child":{"Name":"lj", 
"Age":,"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"][] = ; 
     
    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": , 
    "Alive": true, 
    "FavoriteFilms": [ 
      "Up", 
      "Avatar" 
    ], 
    "Child": null 
  }
  { 
    "Name": "cy", 
    "Age": , 
    "Alive": false, 
    "FavoriteFilms": null, 
    "Child": { 
      "Name": "lj", 
      "Age": , 
      "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[] { , ,  })) 
                    ); 
    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"][] = ; 
    log(style); 

输出:

    { 
      "age": [ 
        , 
         
      ], 
      "funny": true, 
      "array": [ 
        , 
        , 
         
      ] 
    } 
    { 
      "layout": [ 
        , 
        , 
         
      ], 
      "border": { 
        "color": "1px solid cyan" 
      }
      "body>div+p": { 
        "background": "red" 
      } 
    } 

来自:http://www.mzwu.com/article.asp?id=1913

实体类Student:

/// <summary>
/// 学生实体类
/// </summary>
[System.Runtime.Serialization.DataContract(Namespace="http://www.mzwu.com/")]
public class Student
{
    private string _Name;
    private int _Age;

public Student(string name, int age)
    {
        _Name = name;
        _Age = age;
    }

/// <summary>
    /// 姓名
    /// </summary>
    [System.Runtime.Serialization.DataMember]
    public string Name
    {
        set {_Name = value;}
        get { return _Name; }
    }

/// <summary>
    /// 年龄
    /// </summary>
    [System.Runtime.Serialization.DataMember]
    public int Age
    {
        set { _Age = value; }
        get { return _Age; }
    }
}

注意:必须使用DataContractAttribute对类进行标记,使用DataMemberAttribute类成员进行标记,否则该类无法被序列化。

对象转为JSON字符串

Student stu = new Student("张三", 20);

System.Runtime.Serialization.Json.DataContractJsonSerializer json = new System.Runtime.Serialization.Json.DataContractJsonSerializer(stu.GetType());
using (MemoryStream stream = new MemoryStream())
{
    json.WriteObject(stream, stu);
    Response.Write(System.Text.Encoding.UTF8.GetString(stream.ToArray()));
}

JSON字符串转为对象

System.Runtime.Serialization.Json.DataContractJsonSerializer json = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(Student));
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes("{/"Age/":20,/"Name/":/"张三/"} ")))
{
    Student stu = (Student)json.ReadObject(stream);
    Response.Write(string.Format("name:{0},age:{1}", stu.Name, stu.Age));
}

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

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

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

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

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

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

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

  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. C中的流程控制

    一. 流程控制 l 顺序结构:默认的流程结构.按照书写顺序执行每一条语句. l 选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码. l 循环结构:在给定条件成立的情况下,反复执行某一 ...

  2. 荷兰国旗 Flag of the Kingdom of the Netherlands

    问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列 ...

  3. 2.1 CMMI2级——7个PA简述

    摘要: 阶段式的CMMI没有1级,最开始的级别就是2级.一个处于“无序化”生产的软件公司,要进行过程改进,首要是改进什么呢?2级告诉你,我们需要从计划.计划跟踪.需求管理.采购.度量.配置管理.质量保 ...

  4. 初学svn对版本进行控制 用post- commit钩子实现代码同步到web目录

    这里只是一个记录,原文摘抄svn利用钩子实现代码同步到web目录 思路: 找 到SVN Server中的仓库(Repositories)文件夹的位置,在相应的项目文件夹中找到hooks文件夹.在该文件 ...

  5. Git中文版教程

    1. 起步 1.1 关于版本控制 1.2 Git 简史 1.3 Git 基础 1.4 命令行 1.5 安装 Git 1.6 初次运行 Git 前的配置 1.7 获取帮助 1.8 总结 2. Git 基 ...

  6. HTML基础(五)——-css样式表——样式属性——格式与布局

    一.position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角的弹出窗口. 示例: 二.position:absolute     绝对位置: 1.外层没有position:a ...

  7. Dubbo 分布式服务框架(spring、zookeeper)

    DUBBO DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架, alibaba资源 源码:https://github.com ...

  8. phpStydy配置memcache扩展

    一.下载并安装memcached服务器端软件    1.下载memcached软件 32位下载地址: memcached-win32-1.4.4-14.zip(直接下载),memcached-win3 ...

  9. 编写一个Car类,具有String类型的属性品牌,具有功能drive; 定义其子类Aodi和Benchi,具有属性:价格、型号;具有功能:变速; 定义主类E,在其main方法中分别创建Aodi和Benchi的对象并测试对象的特 性。

    package com.hanqi.test; public class Car { //构造一个汽车的属性 private String name; //创建getter和setter方法 publ ...

  10. 多年前写的DataTable与实体类的转换,已放github

    本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 起因 代码 UnitTest G ...