转载自http://www.cnblogs.com/vingi/articles/2578659.html
C#中使用JSON不需要使用第三方库,使用.NET Framwork3.5自带的System.Runtime.Serialization.Json即可很好的完成JSON的解析。
关于JSON的入门介绍见(首页的图很形象):
一、Using
需要添加引用:System.ServiceModel.Web 和 System.Runtime.Serialization,然后使用Using
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
二、定义序列化的类
假如我们要转化的JSON字符串格式为:
{
"encoding":"UTF-8",
"plug-ins":["python","c++","ruby"],
"indent":{
"length":3,
"use_space":true
}
}
然后编写相应的序列化的类,注意下面类加的Attribute:
[DataContract(Namespace = "json")]
class Config
{
[DataMember(Order = 0)]
public string encoding { get; set; }
[DataMember(Order = 1)]
public string[] plugins { get; set; }
[DataMember(Order = 2)]
public Indent indent { get; set; }
}
[DataContract(Namespace = "json")]
class Indent
{
[DataMember(Order = 0)]
public int length { get; set; }
[DataMember(Order = 1)]
public bool useSpace { get; set; }
}
三、对象转化为JSON字符串
使用WriteObject方法:
Config config = new Config()
{
encoding = "UTF-8",
plugins = new string[] { "python", "C++", "C#" },
indent = new Indent()
{
length = 8,
useSpace = false
}
};
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Config));
MemoryStream stream = new MemoryStream();
serializer.WriteObject(stream, config);
//byte[] dataBytes = new byte[stream.Length];
//stream.Position = 0;
//stream.Read(dataBytes, 0, (int)stream.Length);
//string dataString = Encoding.UTF8.GetString(dataBytes);
//注释掉的部分可以用下面这句话代替,更简单了
string dataString = Encoding.UTF8.GetString(stream.ToArray());
stream.Close();
Console.WriteLine("JSON string is:");
Console.WriteLine(dataString);
四、JSON字符串转对象
使用ReadObject方法:
MemoryStream stream2 = new MemoryStream(Encoding.UTF8.GetBytes(dataString));
DataContractJsonSerializer serializer2 = new DataContractJsonSerializer(typeof(Config));
Config config2 = serializer2.ReadObject(stream2) as Config;
stream2.Close();
Console.WriteLine("Encoding is: {0}", config2.encoding);
foreach (string plugin in config2.plugins)
{
Console.WriteLine("plugins is: {0}", plugin);
}
Console.WriteLine("indent.length is: {0}", config2.indent.length);
Console.WriteLine("indent.use_space is: {0}", config2.indent.useSpace);
五、输出结果: