C# 对象转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都比较简单,下面给出示例代码:

private static string getJsonByObject(Object obj)
{
    //实例化DataContractJsonSerializer对象,需要待序列化的对象类型
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    //实例化一个内存流,用于存放序列化后的数据
    MemoryStream stream = new MemoryStream();
    //使用WriteObject序列化对象
    serializer.WriteObject(stream, obj);
    //写入内存流中
    byte[] dataBytes = new byte[stream.Length];
    stream.Position = 0;
    stream.Read(dataBytes, 0, (int)stream.Length);
    //通过UTF8格式转换为字符串
    return Encoding.UTF8.GetString(dataBytes);
}

private static Object getObjectByJson(string jsonString, Object obj)
{
    //实例化DataContractJsonSerializer对象,需要待序列化的对象类型
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    //把Json传入内存流中保存
    MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
    // 使用ReadObject方法反序列化成对象
    return serializer.ReadObject(stream);
}

  通过这个转换类,可以对对象进行序列化成Json和反序列化成对象。但是存在一个问题,就是对于集合类型的数据,可以序列化成Json,但是把这个Json反序列化则会失败,我在这里也没有找到更好的办法反序列化集合类型的数据。现在就一些常见.Net类型的数据进行序列化展示。

  新建一个获取数据的类JsonObject,在其中分别返回一个Person(id,name,age)对象、List<Person>对象、List<string>对象,List<Dictionary<string, object>>对象,分别看看序列化后的数据。

  JsonObject类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebDemo.Json
{
    static public class JsonObject
    {
        static public Person getPerson()
        {
            Person person = new Person();
            person.id = 20;
            person.name = "slive";
            person.age = 24;
            return person;
        }
        static public List<Person> getPersonList()
        {
            List<Person> personList = new List<Person>();
            Person person = new Person();
            person.id = 20;
            person.name = "slive";
            person.age = 24;
            Person person2 = new Person();
            person2.id = 30;
            person2.name = "jack";
            person2.age = 34;
            Person person3 = new Person();
            person3.id = 40;
            person3.name = "damon";
            person3.age = 54;
            personList.Add(person);
            personList.Add(person2);
            personList.Add(person3);
            return personList;
        }
        static public List<string> getStringList()
        {
            List<string> stringlist = new List<string>();
            stringlist.Add("jack");
            stringlist.Add("dick");
            stringlist.Add("sean");
            return stringlist;
        }
        static public List<Dictionary<string,object>> getDicList()
        {
            List<Dictionary<string, object>> dicList = new List<Dictionary<string, object>>();
            Dictionary<string, object> dic1 = new Dictionary<string, object>();
            dic1.Add("id", 17);
            dic1.Add("name", "jerry");
            dic1.Add("age", 24);
            Dictionary<string, object> dic2 = new Dictionary<string, object>();
            dic2.Add("id", 18);
            dic2.Add("name", "meimei");
            dic2.Add("age", 23);
            Dictionary<string, object> dic3 = new Dictionary<string, object>();
            dic3.Add("id", 19);
            dic3.Add("name", "damon");
            dic3.Add("age", 28);
            dicList.Add(dic1);
            dicList.Add(dic2);
            dicList.Add(dic3);
            return dicList;
        }
    }
}

  分别对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}]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值