| 主要类 | 命名空间 | 限制 | 内建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 | 通用 | 是 |
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/