C#对JSON与对象的序列化与反序列化

一、利用Web服务中的JavaScriptSerializer 类

System.Web.Script.Serialization空间,位于System.Web.extensions.dll中。

JavaScriptSerializer jss = new JavaScriptSerializer();
Console.WriteLine(jss.MaxJsonLength);   //默认接受最大的长度是 2097152    这个是接受JSON字符串的最大长度,超长会有什么后果呢?试下

Person p = new Person(1, "关羽", 21);

//序列化
string json = jss.Serialize(p);
Console.WriteLine(json);    //输出 {"Id":1,"Name":"关羽","Age":21}`这就是Json格式了

//反序列化:1、Deserialize泛型写法
Person p2 = jss.Deserialize("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");
Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age);    //输出 1 关羽 21
//反序列化:2、Deserialize的非泛型写法
Person p3 = jss.Deserialize("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}", typeof(Person)) as Person;  //注意这个方法返回的是object类,因此要强制转换成Person类
Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age);    //同样输出 1 关羽 21

//反序列化:3、将Json字符转换为Object类型
object obj = jss.DeserializeObject("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");
Person p4 = jss.ConvertToType(obj);
Console.WriteLine(p4.Name);
Person p5 = jss.ConvertToType(obj, typeof(Person)) as Person;
Console.WriteLine(p5.Name);   

public class Person
{
    public Person()
    { }
    public Person(int id, string name, int age)
    {
        this.Id = id;
        this.Name = name;
        this.Age = age;
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

二、利用WCF中的JSON类:DataContractJsonSerializer

System.Runtine.Serialization命名空间中,位于System.Runtine,Serialization.dll中。

void Main()
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Person));
    //最常用的两个方法
    //反序列化
    string str = "{\"Id\":1,\"Name\":\"刘备\",\"Age\":\"23\"}";
    Person p;
    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str)))     //构造函数能够接受Stream参数,因此你可以用内存流,文件流等等创建
    {
        p = serializer.ReadObject(ms) as Person;
    }
    Console.WriteLine(p.Name);      //输出刘备

    //反序列化
    Person p2 = new Person(2, "关羽", 23);
    byte[] byteArr;
    using (MemoryStream ms = new MemoryStream())
    {
        serializer.WriteObject(ms, p2);
        byteArr = ms.ToArray();
    }
    Console.WriteLine(Encoding.UTF8.GetString(byteArr));    //输出 {"Age":23,"Id":1,"Name":"关羽"}
}

[DataContract]      //对于使用DataContractJsonSerializer类而言,该属性是必须的
public class Person
{
    public Person(int id, string name, int age)
    {
        Id = id;
        Age = age;
        Name = name;
    }

    [DataMember] //对于使用DataContractJsonSerializer类而言,该属性是必须的
    public int Id
    {
        get;
        set;
    }
    [DataMember]
    public string Name
    {
        get;
        set;
    }
    [DataMember]
    public int Age
    {
        get;
        set;
    }
}

三、转换规则

  • String,char =>string
  • DBNull,null=>null,"null"
  • Boolean=>trur/false
  • int,Double,...=>Number
  • DateTime..=>"\/Date(刻度数)\/" ,即用“\/”包含。 
    eg:\/Data(13009188803)\/
  • 枚举数=>整数值 eg:Color.Red=>3
  • List ,Arrary,ArrayLIst,=>JSON 数组 
    eg:new String[]{"2","2","3"}=>["1","2","3"]
  • Dictionary,HashTable =>JSON对象 
    eg:new Dictionary { { 1, "a" }, { 2, "b" }, { 3, "c" } } => {1:"a",2:"b",3:"c"}
  • 具有公共实例属性或字段的非抽象类 =>JSON对象 
    注意:公共只写属性,以及标记[ScriptIgnore]或[IgnoreDataMember]的属性、字段或属性将被忽略。 
    eg: {1:"a",2:"b",3:"c"} 好包括”_type“属性。

四、利用Json.Net三方工具

https://www.newtonsoft.com/json

Json.Net介绍://www.jb51.net/article/247911.htm

五、JSON序列化过程中日期的处理

1、在c#后台进行处理:通过正则表示式

System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
List list = new List();
list.Add(new Student()
{
    age = 10,
    date = DateTime.Now,
    name = "宋兴柱  是个好孩\"子,这里\"有英文逗号"
});

var str = js.Serialize(list);
str = Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match =>
{
    DateTime dt = new DateTime(1970, 1, 1);
    dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value)).ToLocalTime();
    return dt.ToString("yyyy-MM-dd HH:mm:ss");
});

原本内容:[{"age":10,"date":"\/Date(1404098342309)\/","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}] 
显示结果:[{"age":10,"date":"2014-06-30 11:22:15","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}]

2、Json.Net中使用IsoDateTimeConverter格式自定义

IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'年'MM'月'dd'日'" };
string json = JsonConvert.SerializeObject(jack, dtConverter);

参考:Json.Net高级用法

3、在JS中进行处理:

接收json数据,日期格式为:"\/Date(1414078309687)\/"

var value = "/Date(1414078309687)/";

var da = eval('new ' + value.replace('/', '', 'g'));
//或者
var da = value.replace(/\/Date\((\d+)\)\//gi, '$1');   ////通过正则拿到里面数。g 全局 i不区分大小写

da.toLocaleDateString()  //2014/10/23
da.toLocaleTimeString()  //下午11:31:49

六、Json.NET 对比 NET Serializers

性能对比:

功能对比:

特性 Json.Net DataContractJsonSerializer JavaScriptSerializer
Json 支持 支持 支持
Bson 支持 不支持 不支持
Json Schema 支持 不支持 不支持
.Net 2.0 支持 不支持 不支持
.Net 3.5 支持 支持 支持
.Net 4.0 支持 支持 支持
Silverlight 支持 支持 不支持
Windows Phone 支持 支持 不支持
Windows 8 Metro 支持 支持 不支持
Linq to Json 支持 不支持 不支持
Indented Json(有换行格式的Json) 支持 不支持 不支持
Json和XML转换 支持 不支持 不支持
序列化DataTable和DataSet 支持 不支持 不支持
序列化Entity Framework 支持 不支持 不支持

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2022-05-12

C#中实现Json序列化与反序列化的几种方式

什么是JSON? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write and easy for machines to parse and generate. JSON is a text format that is completely language independent. 翻译:Json[javascrip

C#实现json的序列化和反序列化实例代码

在做asp.net和unity进行http通信的时候,当unity客户端发出表单请求的时候,我要将他要请求的数据以json的格式返回给客户端,让客户端来解析.服务器端这一块就涉及到json的序列化和反序列化的问题. 两种方法都有例子,第一种是用泛型集合来存储的对象,然后将集合序列化一下:第二种是直接序列化的一个对象 复制代码 代码如下: using System;using System.Collections.Generic;using System.Web.Script.Serializat

C#对Json进行序列化和反序列化

一.Json简介 Json(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JS的一个子集. Json采用完全独立于语言的文本格式.这使得Json成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. Json简单来说就是JS中的对象和数组,所以Json也存在两种结构:对象.数组. Json对象:Json对象定义在花括号“{}”内,以Key:value键值对的形式存放数据,多个数据使用分号“:”分割. 二.序列化 Object obj =

C#使用Json.Net进行序列化和反序列化及定制化

序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象:反序列化(Deserialize)则是将上面的字节流转换为相应对象的过程:在.Net阵营中,Json.Net是由官方推荐的高性能开源序列化/反序列化工具,其官方网站:https://www.newtonsoft.com/json: 一.将对象序列化为Json格式字符串 首先是正常的序列化操作,对于给定的类: private class MyClass { publi

C#中Json反序列化的实现方法

前言 Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自行在nuget中导入 Json源数据: var data = "{'jingdong_ldop_receive_trace_get_responce':{'code':'0','querytrace_result':{'data':[{'opeTitle':'快递签收','opeRemark':'货物已交付京东物流','

C#使用Json.Net对JSON与对象的序列化与反序列化

目录 一.使用Json.Net 1.把DataTable转换成json格式,使用最新Json.Net DLL ,已经内置转换器. 2.对Json.Net序列化和反序列化的控制 二.空值的处理 三.默认值的处理 四.忽略某些属性 五.支持非公共成员 六.日期处理 1.使用IsoDateTimeConverter 和 JavaScriptDateTimeConverter标准格式 1.如果你要序列化的日期格式是统一的,可以考虑如下方式 2.如果想要不同的日期类型成员序列化后,以不同的形式显示. 2.

C#实现的json序列化和反序列化代码实例

using System; using System.Collections.Generic; using System.Web.Script.Serialization; using System.Configuration; using System.Runtime.Serialization.Json; using System.Runtime.Serialization; using System.IO; using System.Text; namespace WebApplicati

C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例

我就废话不多说啦,大家还是直接看代码吧~ [ { "orderNo": "3213123123123", "time": "2016-09-09 12:23:33", "orderStatus": "1", "freeShipping": true, "fullCut": 20, "originalCost": 340, &qu

C#实现JSON字符串序列化与反序列化的方法

C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product>(){ new Product(){Name="苹果",Price=5}, new Product(){Name="橘子",Price=5}, new Product(){Name="干柿子",Price=00} }; ProductList

ASPNET中JSON的序列化和反序列化的方法

一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'""'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等. JSON具有以下的形式: 对象(Object)是一个无序的"名值对"集合,一个对象以"

JS实现json的序列化和反序列化功能示例

本文实例讲述了JS实现json的序列化和反序列化功能.分享给大家供大家参考,具体如下: 序列化: var s = new Object(); s.Name = "clientValue"; s.Id = 1; s.ClassId = 2; var data = JSON.stringify(s); console.log(data); 反序列化: eval将字符串反序列化成对象 var s = eval('(' + data+ ')'); console.log(s.Name); 完整

PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析

本文实例讲述了PHP中SERIALIZE和JSON的序列化与反序列化操作区别.分享给大家供大家参考,具体如下: PHP中SERIALIZE和JSON序列化与反序列化区别是什么呢,对于这个问题我们可以和小编一起来看看,具体的操作细节如下所示. 在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢? 假设一个对象和一个数组: $web = new stdClass; $web->site = 'tantengvip'; $web->owner = 'tu

ASP.NET中JSON的序列化和反序列化使用说明

在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'""'组成,包含

解析PHP多种序列化与反序列化的方法

序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性.1. serialize和unserialize函数这两个是序列化和反序列化PHP中数据的常用函数. 复制代码 代码如下: <?php$a = array('a'=> 'Apple' ,'b' => 'banana', 'c' => 'Coconut');//序列化数组$s = serialize($a);ech

C#实现Xml序列化与反序列化的方法

本文实例讲述了C#实现Xml序列化与反序列化的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: /// <summary> /// Xml序列化与反序列化 /// </summary> public class XmlUtil { public static string GetRoot(string xml) {     XmlDocument doc = new XmlDocument();     doc.LoadXml(xml.Replace("

Json_decode 解析json字符串为NULL的解决方法(必看)

从APP端或从其他页面post,get过来的数据一般因为数组形式.因为数组形式不易传输,所以一般都会转json后再发送.本以为发送方json_encode(),接收方json_decode(),就解决的问题,结果发现,json_decode()后是NULL. 一般会反应是少了一个参数"true",但是回去看就是 json_decode($data,true); 那怎么还会是NULL呢?难道是编码,不会啊,接收后直接打印是一个完整json字符串的形式,在网上json解析网站,也是可以正常

Java中Json字符串直接转换为对象的方法(包括多层List集合)

使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-beanutils.jar,commons-httpclient.jar,commons-lang.jar,ezmorph.jar,morph-1.0.1.jar 下面是例子代码: // JSON转换 JSONObject jsonObj = JSONObject.fromObject(jsonStr