.NET下几种常见的解析JSON方法
主要类 命名空间 限制 内建LINQ支持
DataContractJsonSerializer System.Runtime.Serialization.Json 通用
JavaScriptSerializer System.Web.Script.Serialization 只能在Web环境使用
JsonArrayJsonObjectJsonValue System.Json 只能在Silverlight中使用
JsonConvertJArrayJObjectJValueJProperty Newtonsoft.Json 通用

DoNet2.0 需要借助于开源的类库Newtonsoft.Json.dll

代码

using System;
using System.IO;
using System.Text;
using Newtonsoft.Json; namespace OfflineAcceptControl.UCTools
{
public class JsonTools
{
// 从一个对象信息生成Json串
public static string ObjectToJson(object obj)
{
return JavaScriptConvert.SerializeObject(obj);
}
// 从一个Json串生成对象信息
public static object JsonToObject(string jsonString, object obj)
{
return JavaScriptConvert.DeserializeObject(jsonString, obj.GetType());
}
}
}

  

内置方式:使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization命名空间下的JavaScriptSerializer类进行对象的序列化与反序列化,很直接。

Project p = new Project() { Input = "stone", Output = "gold" };
JavaScriptSerializer serializer = new JavaScriptSerializer();
var json = serializer.Serialize(p);
Console.WriteLine(json); var p1 = serializer.Deserialize<Project>(json);
Console.WriteLine(p1.Input + "=>" + p1.Output);
Console.WriteLine(ReferenceEquals(p,p1));

注意:如果使用的是VS2010,则要求当前的工程的Target Framework要改成.Net Framework 4,不能使用Client Profile。当然这个System.Web.Extensions.dll主要是Web使用的,直接在Console工程中用感觉有点浪费资源。
  此外,从最后一句也可以看到,序列化与反序列化是深拷贝的一种典型的实现方式

契约方式:使用System.Runtime.Serialization.dll提供的DataContractJsonSerializer或者 JsonReaderWriterFactory实现  

注意引用:System.Runtime.Serialization,System.ServiceModel.Web

代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json; namespace CrjIIOfflineAccept.CrjIITools
{
public class JsonTools
{
// 从一个对象信息生成Json串
public static string ObjectToJson(object obj)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
MemoryStream stream = new MemoryStream();
serializer.WriteObject(stream, obj);
byte[] dataBytes = new byte[stream.Length];
stream.Position = 0;
stream.Read(dataBytes, 0, (int)stream.Length);
return Encoding.UTF8.GetString(dataBytes);
}
// 从一个Json串生成对象信息
public static object JsonToObject(string jsonString, object obj)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
return serializer.ReadObject(mStream);
}
}
}

 这里要注意,这里的Project类和成员要加相关的Attribute:

[DataContract]
class Project
{
[DataMember]
public string Input { get; set; }
[DataMember]
public string Output { get; set; }
}

  将类及类变量的访问权限全改为public。

实用参考:
JSON验证工具:http://jsonlint.com/
JSON简明教程:http://www.w3school.com.cn/json/

最新文章

  1. CSS 布局
  2. Broadcom有线网卡在Windows 8/8.1/10下使用系统自带驱动会断网的解决办法
  3. 【poj1987】 Distance Statistics
  4. HTML+CSS提升小实战
  5. Linux shell misc
  6. java面试中的智力题
  7. POJ 3233 Matrix Power Series 矩阵快速幂
  8. Fluent NHibernate之旅
  9. Android通过类对象的方式实现JSON数据的解析
  10. 2015-09-22CSS:border、background、表格、超链接、overflow、firebug
  11. 多线程12_张孝祥 java5读写锁技术的妙用
  12. 在C#环境中动态调用IronPython脚本(二)
  13. hosts etc css-js
  14. my work
  15. CentOS5/6/7系统下搭建安装Amabari大数据集群时出现SSLError: Failed to connect. Please check openssl library versions.错误的解决办法(图文详解)
  16. mac OS X下Java项目环境搭建+IntelliJ IDEA Jrebel插件安装与破解+Office 2016破解版安装
  17. 782. Transform to Chessboard
  18. leetcode题解之分解字符串域名
  19. 通过jdbc使用PreparedStatement,提升性能,防止sql注入
  20. mount -t nfs 不能使用

热门文章

  1. NOI2005维修数列
  2. MYSQL学习心得
  3. JPA--多对多关系
  4. Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别?
  5. 基于WebForm+EasyUI的业务管理系统形成之旅 -- 施工计划查询(Ⅷ)
  6. HDU 4389 X mod f(x)
  7. Codeforces 633 C Spy Syndrome 2 字典树
  8. Git管理命令
  9. javascript设计模式7
  10. 自己常用的js方法