C#中對(duì)象與JSON字符串互相轉(zhuǎn)換的三種方式
JSON(JavaScriptObject Notation, JS 對(duì)象標(biāo)記) 是一種輕量級(jí)的數(shù)據(jù)交換格式。
關(guān)于內(nèi)存對(duì)象和JSON字符串的相互轉(zhuǎn)換,在實(shí)際項(xiàng)目中應(yīng)比較廣泛,經(jīng)過(guò)一番搜索,找到如下三種方法來(lái)解決此問(wèn)題
分別是使用Newtonsoft.Json.dll、DataContractJsonSerializer、JavaScriptSerializer。
方法一:Newtonsoft.Json.dll
Newtonsoft.Json.dll在.net2.0之后的版本可以支持 我的版本.net framework4.0
添加Newtonsoft.json的引用

對(duì)象與json字符串轉(zhuǎn)換類設(shè)計(jì)
class JsonNewtonsoft
{
/// <summary>
/// 把對(duì)象轉(zhuǎn)換為JSON字符串
/// </summary>
/// <param name="o">對(duì)象</param>
/// <returns>JSON字符串</returns>
public static string ToJSON(this object o)
{
if (o == null)
{
return null;
}
return JsonConvert.SerializeObject(o);
}
/// <summary>
/// 把Json文本轉(zhuǎn)為實(shí)體
/// </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è)計(jì)
class JsonDataContractJsonSerializer
{
/// <summary>
/// 內(nèi)存對(duì)象轉(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)存對(duì)象
/// </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è)計(jì)
public static class JsonJavaScriptSerializer
{
/// <summary>
/// 內(nèi)存對(duì)象轉(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)存對(duì)象
/// </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);
}
}程序測(cè)試:
新建一個(gè)測(cè)試對(duì)象類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;
}
}測(cè)試程序
static void Main(string[] args)
{
Student st = new Student("笨男孩",22,Sex.男);
Console.WriteLine("============方法一============================================");
//方法一
Console.WriteLine("方法一對(duì)象轉(zhuǎn)Json字符串");
string jsonStr = JsonNewtonsoft.ToJSON(st);
Console.WriteLine(jsonStr);
Console.WriteLine("方法一Json字符串轉(zhuǎn)對(duì)象");
Student stobj = (Student)JsonNewtonsoft.FromJSON<Student>(jsonStr);
Console.WriteLine("姓名:{0} 年齡:{1} 性別:{2}",stobj.Name,stobj.Age,stobj.Sex);
Console.WriteLine("============方法二============================================");
//方法二
Console.WriteLine("方法二對(duì)象轉(zhuǎn)Json字符串");
string jsonStr2 = JsonDataContractJsonSerializer.ToJSON(st);
Console.WriteLine(jsonStr2);
Console.WriteLine("方法二Json字符串轉(zhuǎn)對(duì)象");
Student stobj2 = (Student)JsonDataContractJsonSerializer.FromJSON(jsonStr2, st);
Console.WriteLine("姓名:{0} 年齡:{1} 性別:{2}", stobj2.Name, stobj2.Age, stobj2.Sex);
Console.WriteLine("============方法三============================================");
//方法二
Console.WriteLine("方法三對(duì)象轉(zhuǎn)Json字符串");
string jsonStr3 = JsonJavaScriptSerializer.ToJSON(st);
Console.WriteLine(jsonStr3);
Console.WriteLine("方法三Json字符串轉(zhuǎn)對(duì)象");
Student stobj3 = (Student)JsonJavaScriptSerializer.FromJSON<Student>(jsonStr3);
Console.WriteLine("姓名:{0} 年齡:{1} 性別:{2}", stobj3.Name, stobj3.Age, stobj3.Sex);
Console.ReadKey();
}程序運(yùn)行結(jié)果:

運(yùn)行結(jié)果:

性能對(duì)比:

綜上所述,一般采用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
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- C#使用Enum.TryParse()實(shí)現(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)換操作實(shí)例分析
- C# 字符串、數(shù)組和List的截取和轉(zhuǎn)換實(shí)例
- C#實(shí)現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法
- C# 中 TryParse如何將字符串轉(zhuǎn)換為特定類型
相關(guān)文章
網(wǎng)頁(yè)編輯器ckeditor和ckfinder配置步驟分享
ckeditor+ckfinder配置用法,現(xiàn)在ckeditor是互聯(lián)網(wǎng)上應(yīng)用比較廣泛的網(wǎng)頁(yè)編輯器了,這里介紹下配置方法,需要的朋友可以參考下2012-05-05
javascript中的throttle和debounce淺析
這篇文章主要介紹了javascript中的throttle和debounce淺析,分別介紹了throttle和debounce的使用場(chǎng)景及具體案例,需要的朋友可以參考下2014-06-06
JavaScript中__proto__與prototype的關(guān)系深入理解
本文將討論下對(duì)象的內(nèi)部原型(__proto__)和構(gòu)造器的原型(prototype)的關(guān)系,需要了解更多的朋友可以參考下2012-12-12
JavaScript的instanceof運(yùn)算符學(xué)習(xí)教程
instanceof運(yùn)算符可以用來(lái)判斷某個(gè)構(gòu)造函數(shù)的prototype屬性所指向的對(duì)象是否存在于另外一個(gè)要檢測(cè)對(duì)象的原型鏈上,這里我們就來(lái)看一下JavaScript的instanceof運(yùn)算符學(xué)習(xí)教程2016-06-06
舉例說(shuō)明JavaScript中的實(shí)例對(duì)象與原型對(duì)象
這篇文章主要介紹了JavaScript中的實(shí)例對(duì)象與原型對(duì)象,針對(duì)constructor屬性和prototype屬性展開來(lái)講,需要的朋友可以參考下2016-03-03

