C 對象與JSON字符串互相轉換的幾種方式
阿新 • • 發佈:2019-03-04
pty reader font clear time nor one returns type
隨著 Rest 風格 API 的應用越來越廣泛,對象與JSON字符串互相轉換的功能也用的越來越多。這裏介紹三種方法,期中兩種為DotNet Framework .NET 3.5 及後續版本自帶的 DataContractJsonSerializer、 JavaScriptSerializer,另一種為 Newtonsoft.Json.dll ,我選擇它的原因是因為它支持 DotNet Framework .NET 2.0。
方法一、DoNet2.0 需要借助於Newtonsoft.Json.dll
我使用的版本是:Version 10.0.3
// 從一個對象信息生成Json串
public static string ObjectToJson(object obj)
{
return JsonConvert.SerializeObject(obj);
}
// 從一個Json串生成對象信息
public static object JsonToObject(string jsonString, object obj)
{
return JsonConvert.DeserializeObject(jsonString, obj.GetType());
}
方法二、DataContractJsonSerializer
/// <summary>
/// Json轉換成對象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jsonText"></param>
/// <returns></returns>
public static T JsonToObject<T>(string jsonText)
{
// Framework 2.0 不支持
DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));
T obj = (T)s.ReadObject(ms);
ms.Dispose();
return obj;
}
/// <summary>
/// 對象轉換成JSON
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string ObjectToJSON<T>(T obj)
{
// Framework 2.0 不支持
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
string result = string.Empty;
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
ms.Position = 0;
using (StreamReader read = new StreamReader(ms))
{
result = read.ReadToEnd();
}
}
return result;
}
namespace SL_DataContractJsonSerializer
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
}
//This uses an event handler, not SL data binding
void OnClick(object sender, EventArgs args)
{
txtOutput1.Text = "Create a User object and serialize it.";
string json = WriteFromObject();
txtOutput2.Text = json.ToString(); // Displays: {"Age":42,"Name":"Bob"}
txtOutput3.Text = "Deserialize the data to a User object.";
string jsonString = "{‘Name‘:‘Bill‘, ‘Age‘:53}";
User deserializedUser = ReadToObject(jsonString);
txtOutput4.Text = deserializedUser.Name; // Displays: Bill
txtOutput5.Text = deserializedUser.Age.ToString(); // Displays: 53
}
// Create a User object and serialize it to a JSON stream.
public static string WriteFromObject()
{
//Create User object.
User user = new User("Bob", 42);
//Create a stream to serialize the object to.
MemoryStream ms = new MemoryStream();
// Serializer the User object to the stream.
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));
ser.WriteObject(ms, user);
byte[] json = ms.ToArray();
ms.Close();
return Encoding.UTF8.GetString(json, 0, json.Length);
}
// Deserialize a JSON stream to a User object.
public static User ReadToObject(string json)
{
User deserializedUser = new User();
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedUser.GetType());
deserializedUser = ser.ReadObject(ms) as User;
ms.Close();
return deserializedUser;
}
}
[DataContract]
public class User
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
public User() { }
public User(string newName, int newAge)
{
Name = newName;
Age = newAge;
}
}
}
方法三、JavaScriptSerializer
public static void JsonMy(string json)
{
JavaScriptSerializer js = new JavaScriptSerializer(); //實例化一個能夠序列化數據的類
ToJsonMy list = js.Deserialize<ToJsonMy>(json); //將json數據轉化為對象類型並賦值給list
string result = list.result;
string res_info = list.res_info;
string queryorder_info = list.res_info;
}
public static void JsonMy4(string json)
{
JavaScriptSerializer js = new JavaScriptSerializer(); //實例化一個能夠序列化數據的類
ToJsonMy3 list = js.Deserialize<ToJsonMy3>(json); //將json數據轉化為對象類型並賦值給list
string result = list.result;
string res_info = list.res_info;
string order_num = list.queryorder_info.order_num;
List<orderdetail> orderdetail = list.queryorder_info.orderdetail;
string CFTUin = orderdetail[0].CFTUin;
string HotelName = orderdetail[0].HotelName;
string ListID = orderdetail[1].ListID;
string State = orderdetail[2].State;
}
功能對比
性能對比
相關工具網站:JSON轉C#實體類
相關參考:
https://www.newtonsoft.com/json
DataContractJsonSerializer 類
我使用的版本是:Version 10.0.3
// 從一個對象信息生成Json串
public static string ObjectToJson(object obj)
{
return JsonConvert.SerializeObject(obj);
}
// 從一個Json串生成對象信息
public static object JsonToObject(string jsonString, object obj)
{
return JsonConvert.DeserializeObject(jsonString, obj.GetType());
}
方法二、DataContractJsonSerializer
/// <summary>
/// Json轉換成對象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jsonText"></param>
/// <returns></returns>
public static T JsonToObject<T>(string jsonText)
{
// Framework 2.0 不支持
DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));
T obj = (T)s.ReadObject(ms);
ms.Dispose();
return obj;
}
/// <summary>
/// 對象轉換成JSON
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string ObjectToJSON<T>(T obj)
{
// Framework 2.0 不支持
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
string result = string.Empty;
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
ms.Position = 0;
using (StreamReader read = new StreamReader(ms))
{
result = read.ReadToEnd();
}
}
return result;
}
namespace SL_DataContractJsonSerializer
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
}
//This uses an event handler, not SL data binding
void OnClick(object sender, EventArgs args)
{
txtOutput1.Text = "Create a User object and serialize it.";
string json = WriteFromObject();
txtOutput2.Text = json.ToString(); // Displays: {"Age":42,"Name":"Bob"}
txtOutput3.Text = "Deserialize the data to a User object.";
string jsonString = "{‘Name‘:‘Bill‘, ‘Age‘:53}";
User deserializedUser = ReadToObject(jsonString);
txtOutput4.Text = deserializedUser.Name; // Displays: Bill
txtOutput5.Text = deserializedUser.Age.ToString(); // Displays: 53
}
// Create a User object and serialize it to a JSON stream.
public static string WriteFromObject()
{
//Create User object.
User user = new User("Bob", 42);
//Create a stream to serialize the object to.
MemoryStream ms = new MemoryStream();
// Serializer the User object to the stream.
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));
ser.WriteObject(ms, user);
byte[] json = ms.ToArray();
ms.Close();
return Encoding.UTF8.GetString(json, 0, json.Length);
}
// Deserialize a JSON stream to a User object.
public static User ReadToObject(string json)
{
User deserializedUser = new User();
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedUser.GetType());
deserializedUser = ser.ReadObject(ms) as User;
ms.Close();
return deserializedUser;
}
}
[DataContract]
public class User
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
public User() { }
public User(string newName, int newAge)
{
Name = newName;
Age = newAge;
}
}
}
方法三、JavaScriptSerializer
public static void JsonMy(string json)
{
JavaScriptSerializer js = new JavaScriptSerializer(); //實例化一個能夠序列化數據的類
ToJsonMy list = js.Deserialize<ToJsonMy>(json); //將json數據轉化為對象類型並賦值給list
string result = list.result;
string res_info = list.res_info;
string queryorder_info = list.res_info;
}
public static void JsonMy4(string json)
{
JavaScriptSerializer js = new JavaScriptSerializer(); //實例化一個能夠序列化數據的類
ToJsonMy3 list = js.Deserialize<ToJsonMy3>(json); //將json數據轉化為對象類型並賦值給list
string result = list.result;
string res_info = list.res_info;
string order_num = list.queryorder_info.order_num;
List<orderdetail> orderdetail = list.queryorder_info.orderdetail;
string CFTUin = orderdetail[0].CFTUin;
string HotelName = orderdetail[0].HotelName;
string ListID = orderdetail[1].ListID;
string State = orderdetail[2].State;
}
功能對比
性能對比
相關工具網站:JSON轉C#實體類
相關參考:
https://www.newtonsoft.com/json
DataContractJsonSerializer 類
c# json數據解析——將字符串json格式數據轉換成對象
Json.net實現方便的Json轉C#(dynamic動態類型)對象
C# JSON和對象之間互相轉換
C# 對象與JSON串互相轉換
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net
C 對象與JSON字符串互相轉換的幾種方式