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

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

     
     
    分类: .Net
    标签: C# .net json
  • 相关阅读:
    解析大型.NET ERP系统 权限模块设计与实现
    Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架
    解析大型.NET ERP系统 单据编码功能实现
    解析大型.NET ERP系统 单据标准(新增,修改,删除,复制,打印)功能程序设计
    Windows 10 部署Enterprise Solution 5.5
    解析大型.NET ERP系统 设计异常处理模块
    解析大型.NET ERP系统 业务逻辑设计与实现
    解析大型.NET ERP系统 多国语言实现
    Enterprise Solution 管理软件开发框架流程实战
    解析大型.NET ERP系统 数据审计功能
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3155649.html
Copyright © 2011-2022 走看看