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

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

  • 相关阅读:
    基于范围的for循环
    ML.NET技术研究系列-2聚类算法KMeans
    SQLServer常用运维SQL整理
    ML.NET技术研究系列-1入门篇
    Kafka基本知识整理
    .NetCore技术研究-EntityFramework Core 3.0 Preview
    容器技术研究-Kubernetes基本概念
    特来电混沌工程实践-混沌事件注入
    .Net Core技术研究-Span<T>和ValueTuple<T>
    Visual Studio Git本地Repos和GitHub远程Repos互操作
  • 原文地址:https://www.cnblogs.com/plokmju/p/ObjectByJson.html
Copyright © 2011-2022 走看看