C#--对象转Json序列化

C#--对象转Json序列化 

前言

  最近在研究Android项目,其中涉及到Android中解析Json数据的问题,需要模拟网络中传递Json数据的模式,因为以前是.net的工程师,所以想着从.net的平台开发服务,传递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流写入的方式转换。对于DataContrac tJsonSerializer对象而言,序列化和反序列化只需要了解两个方法即可,这两个方法都具有多放重载,适用于不同的环境,这两个方法是:

 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客户端做准备,虽然这种方式对于集合的反序列化存在问题,但是不影响序列化与数据传递。

  

你可能感兴趣的:(json)