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

  

时间: 2024-10-12 11:37:50

C#--对象转Json序列化的相关文章

对String对象进行JSON序列化

对对象进行JSON序列化,会得到类似key:value的形式. 但是如果对一个String字符串进行JSON序列化会得到什么? 测试下: public?class?TestMain2?{ ????public?static?void?main(String?args[]){ ????????String?s?=?"a"; ????????System.out.println(JSON.toJSONString(s)); ????????System.out.println(s); ??

转载C# 对象转Json序列化

转载原地址:  http://www.cnblogs.com/plokmju/p/ObjectByJson.html JSON Json(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JS的一个子集. Json采用完全独立于语言的文本格式.这使得Json成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. Json简单来说就是JS中的对象和数组,所以Json也存在两种结构:对象.数组. Json对象:Json对象定义在花括号“{}”内,

EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json

1.在使用EF时,由于数据库主外键关联,将对象进行Json序列化时会遇到循环引用的问题 //EF 中由于数据库主外键关联,对象的序列化经常出现循环引用问题 //使用.Net 自带的序列化工具,序列化出现循环引用问题 List<student> list = _Context.students.ToList(); JavaScriptSerializer ser = new JavaScriptSerializer(); string str = ser.Serialize(list); Con

spring mvc返回json字符串数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable

1.spring mvc返回json数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable 2. @RequestMapping(value = { "/actor_details" }, method = { RequestMethod.POST }) @ResponseBody public ResultObject actorDetails(@RequestBody ActorDetailsRequest req)

EF中Json序列化对象时检测到循环引用的解决办法

第一种方法:使用Newtonsoft.Json中的方法注释,在Json序列化的时候忽略导航属性 例:using Newtonsoft.Json; public class Users { public int Id { get; set; } public string LoginId { get; set; } public string LoginPwd { get; set; } [JsonIgnore] public virtual ICollection Roles { get; se

转载:在ASP.net 3.5中 用JSON序列化对象(两种方法)

asp.net3.5中已经集成了序列化对象为json的方法. 1:System.Runtime.Serialization.Json;    2:System.Web.Script.Serialization两个命名空间下的不同方法进行序列化和反序列化. 第一种方法:System.Runtime.Serialization.Json public class JsonHelper    {        /// <summary>        /// 生成Json格式        /// 

利用fastjson序列化对象为JSON

利用fastjson序列化对象为JSON 参考博客:http://blog.csdn.net/zeuskingzb/article/details/17468079 Step1:定义实体类 //用户类 public class User { private Long id; private String name; //增加get/set方法 } //定义组,1组有多个用户 public class Group { private Long id; private String name; pr

java对象json序列化时候忽略为null的属性

环境: jdk: openjdk11 操作系统: windows 10教育版1903 目的: 如题,当一个对象里有些属性值为null 的不想参与json序列化时,可以添加如下注解 import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonIgnore; //这个是类注解,表示该类实例化的对象里,值为null的字段不参与序列化@JsonInclude(JsonIn

Json序列化

最近在学习FyiReporting的源码,参考FyiReporting的报表对象定义,结合自己在工作中开发报表的应用场景,自己设计了一套报表对象定义,实现在报表设计器中报表对象的修改,通过序列化成Json对象来达到存储报表对象,相对于FyiReporting报表直接对报表定义的XML操作省去编写大量直接解析XML文档的方法,可能会带来点效率损失.本文主要目的在总结自己在序列化对象的时候对类信息标记常用用法,不在于对FyiReporting做过多探讨.首先自己写的Json序列化操作的类: clas