博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#--对象转Json序列化
阅读量:5062 次
发布时间:2019-06-12

本文共 4904 字,大约阅读时间需要 16 分钟。

前言

  最近在研究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
getPersonList()19 {20 List
personList = new List
();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
getStringList()39 {40 List
stringlist = new List
();41 stringlist.Add("jack");42 stringlist.Add("dick");43 stringlist.Add("sean");44 return stringlist;45 }46 static public List
> getDicList()47 {48 List
> dicList = new List
>();49 Dictionary
dic1 = new Dictionary
();50 dic1.Add("id", 17);51 dic1.Add("name", "jerry");52 dic1.Add("age", 24);53 Dictionary
dic2 = new Dictionary
();54 dic2.Add("id", 18);55 dic2.Add("name", "meimei");56 dic2.Add("age", 23);57 Dictionary
dic3 = new Dictionary
();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客户端做准备,虽然这种方式对于集合的反序列化存在问题,但是不影响序列化与数据传递。

  请支持原创,尊重原创,转载请注明出处。谢谢。

 

 

转载于:https://www.cnblogs.com/plokmju/p/ObjectByJson.html

你可能感兴趣的文章
用代码生成器生成的DAL数据访问操作类 基本满足需求了
查看>>
28初识线程
查看>>
Monkey测试结果分析
查看>>
Sublime Text 3 设置
查看>>
浅谈C++底层机制
查看>>
STL——配接器、常用算法使用
查看>>
第9课 uart
查看>>
Range和xrange的区别
查看>>
STL容器之vector
查看>>
无法向会话状态服务器发出会话状态请求
查看>>
数据中心虚拟化技术
查看>>
01入门
查看>>
复习文件操作
查看>>
C#Hashtable与Dictionary性能
查看>>
10个让你忘记 Flash 的 HTML5 应用演示
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
Primary definition
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
发送请求时params和data的区别
查看>>