C#--對象轉Json序列化


前言

  最近在研究Android項目,其中涉及到Android中解析Json數據的問題,需要模擬網絡中傳遞Json數據的模式,因為以前是.net的工程師,所以想着從.net的平台開發服務,傳遞Json格式的數據。那么先來介紹一些什么是JSON。

 

JSON

  Json(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於JS的一個子集。 Json采用完全獨立於語言的文本格式。這使得Json成為理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。

  Json簡單來說就是JS中的對象和數組,所以Json也存在兩種結構:對象、數組。

  • Json對象:Json對象定義在花括號“{}”內,以Key:value鍵值對的形式存放數據,多個數據使用分號“;”分割。

  • Json數組:Json數組定義在方括號“[]”內,以字符串的形式存放數據,多個數據使用分號“;”分割。

 

Json序列化與反序列化

  對於.Net而言,從3.5之后就提供了DataContractJsonSerializer類,需要引用DLL,System.Runtime.Serialization。使用方式很簡單,需要知道待轉換的對象的類型,然后通過MemoryStream流寫入的方式轉換。對於DataContractJsonSerializer對象而言,序列化和反序列化只需要了解兩個方法即可,這兩個方法都具有多放重載,適用於不同的環境,這兩個方法是:

  • WriteObject:將指定對象序列化為Json數據,並將生成的 Json寫入流中。
  • ReadObject:以 Json格式讀取文檔流,並返回反序列化的對象。

  使用DataContractJsonSerializer序列化對象和反序列化Json都比較簡單,下面給出示例代碼:

 1         private static string getJsonByObject(Object obj)
 2         {
 3             //實例化DataContractJsonSerializer對象,需要待序列化的對象類型
 4             DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
 5             //實例化一個內存流,用於存放序列化后的數據
 6             MemoryStream stream = new MemoryStream();
 7             //使用WriteObject序列化對象
 8             serializer.WriteObject(stream, obj);
 9             //寫入內存流中
10             byte[] dataBytes = new byte[stream.Length];
11             stream.Position = 0;
12             stream.Read(dataBytes, 0, (int)stream.Length);
13             //通過UTF8格式轉換為字符串
14             return Encoding.UTF8.GetString(dataBytes);
15         }
16 
17         private static Object getObjectByJson(string jsonString, Object obj)
18         {
19             //實例化DataContractJsonSerializer對象,需要待序列化的對象類型
20             DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
21             //把Json傳入內存流中保存
22             MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
23             // 使用ReadObject方法反序列化成對象
24             return serializer.ReadObject(stream);
25         }

  通過這個轉換類,可以對對象進行序列化成Json和反序列化成對象。但是存在一個問題,就是對於集合類型的數據,可以序列化成Json,但是把這個Json反序列化則會失敗,我在這里也沒有找到更好的辦法反序列化集合類型的數據。現在就一些常見.Net類型的數據進行序列化展示。

  新建一個獲取數據的類JsonObject,在其中分別返回一個Person(id,name,age)對象、List<Person>對象、List<string>對象,List<Dictionary<string, object>>對象,分別看看序列化后的數據。

  JsonObject類:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 namespace WebDemo.Json
 7 {
 8     static public class JsonObject
 9     {
10         static public Person getPerson()
11         {
12             Person person = new Person();
13             person.id = 20;
14             person.name = "slive";
15             person.age = 24;
16             return person;
17         }
18         static public List<Person> getPersonList()
19         {
20             List<Person> personList = new List<Person>();
21             Person person = new Person();
22             person.id = 20;
23             person.name = "slive";
24             person.age = 24;
25             Person person2 = new Person();
26             person2.id = 30;
27             person2.name = "jack";
28             person2.age = 34;
29             Person person3 = new Person();
30             person3.id = 40;
31             person3.name = "damon";
32             person3.age = 54;
33             personList.Add(person);
34             personList.Add(person2);
35             personList.Add(person3);
36             return personList;
37         }
38         static public List<string> getStringList()
39         {
40             List<string> stringlist = new List<string>();
41             stringlist.Add("jack");
42             stringlist.Add("dick");
43             stringlist.Add("sean");
44             return stringlist;
45         }
46         static public List<Dictionary<string,object>> getDicList()
47         {
48             List<Dictionary<string, object>> dicList = new List<Dictionary<string, object>>();
49             Dictionary<string, object> dic1 = new Dictionary<string, object>();
50             dic1.Add("id", 17);
51             dic1.Add("name", "jerry");
52             dic1.Add("age", 24);
53             Dictionary<string, object> dic2 = new Dictionary<string, object>();
54             dic2.Add("id", 18);
55             dic2.Add("name", "meimei");
56             dic2.Add("age", 23);
57             Dictionary<string, object> dic3 = new Dictionary<string, object>();
58             dic3.Add("id", 19);
59             dic3.Add("name", "damon");
60             dic3.Add("age", 28);
61             dicList.Add(dic1);
62             dicList.Add(dic2);
63             dicList.Add(dic3);
64             return dicList;
65         }
66     }
67 }

  分別對JsonObject返回的數據進行序列化,可以看到結果:

  • getPerson():{"age":24,"id":20,"name":"slive"}
  • getPersonList():[{"age":24,"id":20,"name":"slive"},{"age":34,"id":30,"name":"jack"},{"age":54,"id":40,"name":"damon"}]
  • getStringList():["jack","dick","sean"]
  • getDicList():[[{"Key":"id","Value":17},{"Key":"name","Value":"jerry"},{"Key":"age","Value":24}],[{"Key":"id","Value":18},{"Key":"name","Value":"meimei"},{"Key":"age","Value":23}],[{"Key":"id","Value":19},{"Key":"name","Value":"damon"},{"Key":"age","Value":28}]]

總結

  最近一直在研究Android開發,所以涉及到Json的解析問題,才會想着找找對於Json對象的序列化的實現。Json作為一個獨立於語言的文本,使用什么語言並不重要,這里只是需要把數據對象序列化為Json,傳遞給Android客戶端做准備,雖然這種方式對於集合的反序列化存在問題,但是不影響序列化與數據傳遞。

  請支持原創,尊重原創,轉載請注明出處。謝謝。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM