C#中對象與JSON字符串互相轉(zhuǎn)換的三種方式
JSON(JavaScriptObject Notation, JS 對象標記) 是一種輕量級的數(shù)據(jù)交換格式。
關(guān)于內(nèi)存對象和JSON字符串的相互轉(zhuǎn)換,在實際項目中應(yīng)比較廣泛,經(jīng)過一番搜索,找到如下三種方法來解決此問題
分別是使用Newtonsoft.Json.dll
、DataContractJsonSerializer
、JavaScriptSerializer
。
方法一:Newtonsoft.Json.dll
Newtonsoft.Json.dll在.net2.0之后的版本可以支持 我的版本.net framework4.0
添加Newtonsoft.json的引用
對象與json字符串轉(zhuǎn)換類設(shè)計
class JsonNewtonsoft { /// <summary> /// 把對象轉(zhuǎn)換為JSON字符串 /// </summary> /// <param name="o">對象</param> /// <returns>JSON字符串</returns> public static string ToJSON(this object o) { if (o == null) { return null; } return JsonConvert.SerializeObject(o); } /// <summary> /// 把Json文本轉(zhuǎn)為實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="input"></param> /// <returns></returns> public static T FromJSON<T>(this string input) { try { return JsonConvert.DeserializeObject<T>(input); } catch (Exception ex) { return default(T); } } }
方法二:DataContractJsonSerializer
使用這種 需要引用System.Runtime.Serialization.dll
類設(shè)計
class JsonDataContractJsonSerializer { /// <summary> /// 內(nèi)存對象轉(zhuǎn)換為json字符串 /// </summary> /// <param name="obj"></param> /// <returns></returns> 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); } /// <summary> /// Json字符串轉(zhuǎn)內(nèi)存對象 /// </summary> /// <param name="jsonString"></param> /// <param name="obj"></param> /// <returns></returns> 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); } }
方法三:JavaScriptSerializer
需要引用:System.Web.Extensions.dll
類設(shè)計
public static class JsonJavaScriptSerializer { /// <summary> /// 內(nèi)存對象轉(zhuǎn)換為json字符串 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static string ToJSON(object obj) { StringBuilder sb = new StringBuilder(); JavaScriptSerializer json = new JavaScriptSerializer(); json.Serialize(obj, sb); return sb.ToString(); } /// <summary> /// Json字符串轉(zhuǎn)內(nèi)存對象 /// </summary> /// <param name="jsonString"></param> /// <param name="obj"></param> /// <returns></returns> public static T FromJSON<T>(string jsonString) { JavaScriptSerializer json = new JavaScriptSerializer(); return json.Deserialize<T>(jsonString); } }
程序測試:
新建一個測試對象類Student.cs
public enum Sex { 男=0, 女=1 } [Serializable()] class Student { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } private Sex _sex = Sex.男; public Sex Sex { get { return _sex; } set { _sex = value; } } public Student() { } public Student(string name,int age,Sex sex) { this._name = name; this._age = age; this._sex = sex; } }
測試程序
static void Main(string[] args) { Student st = new Student("笨男孩",22,Sex.男); Console.WriteLine("============方法一============================================"); //方法一 Console.WriteLine("方法一對象轉(zhuǎn)Json字符串"); string jsonStr = JsonNewtonsoft.ToJSON(st); Console.WriteLine(jsonStr); Console.WriteLine("方法一Json字符串轉(zhuǎn)對象"); Student stobj = (Student)JsonNewtonsoft.FromJSON<Student>(jsonStr); Console.WriteLine("姓名:{0} 年齡:{1} 性別:{2}",stobj.Name,stobj.Age,stobj.Sex); Console.WriteLine("============方法二============================================"); //方法二 Console.WriteLine("方法二對象轉(zhuǎn)Json字符串"); string jsonStr2 = JsonDataContractJsonSerializer.ToJSON(st); Console.WriteLine(jsonStr2); Console.WriteLine("方法二Json字符串轉(zhuǎn)對象"); Student stobj2 = (Student)JsonDataContractJsonSerializer.FromJSON(jsonStr2, st); Console.WriteLine("姓名:{0} 年齡:{1} 性別:{2}", stobj2.Name, stobj2.Age, stobj2.Sex); Console.WriteLine("============方法三============================================"); //方法二 Console.WriteLine("方法三對象轉(zhuǎn)Json字符串"); string jsonStr3 = JsonJavaScriptSerializer.ToJSON(st); Console.WriteLine(jsonStr3); Console.WriteLine("方法三Json字符串轉(zhuǎn)對象"); Student stobj3 = (Student)JsonJavaScriptSerializer.FromJSON<Student>(jsonStr3); Console.WriteLine("姓名:{0} 年齡:{1} 性別:{2}", stobj3.Name, stobj3.Age, stobj3.Sex); Console.ReadKey(); }
程序運行結(jié)果:
運行結(jié)果:
性能對比:
綜上所述,一般采用Json.NET方法一比較好!
參考:
JavaScriptSerializer類介紹:https://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx
DataContractJsonSerializer類介紹:https://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.json.datacontractjsonserializer(v=vs.110).aspx
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- C#使用Enum.TryParse()實現(xiàn)枚舉安全轉(zhuǎn)換
- c#中(int)、int.Parse()、int.TryParse、Convert.ToInt32的區(qū)別詳解
- C#(int)中Convert、Parse、TryParse的區(qū)別
- C#字節(jié)數(shù)組(byte[])和字符串相互轉(zhuǎn)換方式
- c#?如何將字符串轉(zhuǎn)換為大寫或小寫
- C#中字符串與字節(jié)數(shù)組的轉(zhuǎn)換方式
- C#日期格式字符串的相互轉(zhuǎn)換操作實例分析
- C# 字符串、數(shù)組和List的截取和轉(zhuǎn)換實例
- C#實現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法
- C# 中 TryParse如何將字符串轉(zhuǎn)換為特定類型
相關(guān)文章
分享javascript實現(xiàn)的冒泡排序代碼并優(yōu)化
本文給大家匯總介紹了幾個個人收藏的JavaScript實現(xiàn)冒泡排序的代碼,都是非常的不錯,有需要的小伙伴可以參考下2016-06-06javascript中數(shù)組array及string的方法總結(jié)
本文結(jié)合自己的使用經(jīng)驗,給大家總結(jié)了javascript中數(shù)組array及string的使用方法,這里推薦給有需要的小伙伴。2014-11-11window.location.href的用法(動態(tài)輸出跳轉(zhuǎn))
無論在靜態(tài)頁面還是動態(tài)輸出頁面中window.location.href都是不錯的用了跳轉(zhuǎn)的實現(xiàn)方案2014-08-08addEventListener和attachEvent二者綁定的執(zhí)行函數(shù)中的this不相同
寫 addEventListener 和 attachEvent 區(qū)別的博文不少,不過大部分都把重點放置于前者是Firefox chrome,后者只是存在于IE系列中2012-12-12