添加引用
如果是 .NET 3.5 则需要添加两个引用(注意是引用,不是命名空间):
System.ServiceModel.Web
System.Runtime.Serialization
如果是 .NET 4.0 则只需要添加一个引用:
System.Runtime.Serialization
核心类
using System.Runtime.Serialization.Json; using System.IO; using System.Text; namespace Cftea { public class JsonHelper { /// <summary> /// 将 JSON 对象转换成 JSON 格式的字符串。 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static string ObjectToString(object jsonObject) { string result = ""; using (MemoryStream ms = new MemoryStream()) { // 对象 ==>> MemoryStream DataContractJsonSerializer serializer = new DataContractJsonSerializer(jsonObject.GetType()); serializer.WriteObject(ms, jsonObject); // MemoryStream ==>> 字符串 ms.Position = 0; using (StreamReader reader = new StreamReader(ms)) { result = reader.ReadToEnd(); reader.Close(); } ms.Close(); } return result; } /// <summary> /// 将 JSON 格式的字符串转换成 JSON 对象。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="jsonString"></param> /// <returns></returns> public static T StringToObject<T>(string jsonString) { T result; using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); result = (T)serializer.ReadObject(ms); ms.Close(); } return result; } } }
使用示例
public class Book { public string Name { get; set; } public decimal Price { get; set; } } // ObjectToString 应用示例 Book book = new Book(); book.Name = "ITPOW丛书"; book.Price = 95m; string str = JsonHelper.ObjectToString(book); MessageBox.Show(str); // StringToObject 应用示例 Book newBook = JsonHelper.StringToObject<Book>("{ "Name" : "ITPOW新书", "Price" : 98 }"); MessageBox.Show(newBook.Name);
注意:Book 一定要是 public 的,否则会出现“无法序列化类型”的错误。
JSON 字符串
JSON 字符串如果为 Null、Empty、非 JSON 格式
异常。
JSON 字符串中有多余的属性
忽略字符串中多余的属性。
JSON 字符串中有缺失的属性
类中,这些缺失的属性,其值为构造函数中赋的值,如果构造函数中没有赋值,则使用默认值(数字 0、字符串 null)。
JSON 字符串中属性名称与类属性名称一样,但数据类型不一样
JSON 字符串中属性名称与类属性名称一样时,就可映射,当数据类型不一样时,自动转换,如果转换失败,则异常。
其他
说明:属性的“读”和“写”都必须是 public 的。有人说,我的“写”如果不是 public 的,转换成 JSON 字符串有什么影响,似乎不会有影响吧,又不是“读”?答案是:JSON 字符串中照样会跳过这个属性。
生成的 JSON 字符串中的属性是按属性名称的 ASCII 排列的。
注意:.NET 中的 JSON 是标准格式,即属性名称要用双引号引起来。
正确的格式:{ "Name" : "ITPOW新书" }
错误的格式:{ Name : "ITPOW新书" }
相关阅读
JSON 中日期格式转换出错?