www.91084.com

GVKun编程网logo

json —— pickle 的序列化和反序列化(jsonproperty反序列化)

29

在本文中,我们将带你了解json——pickle的序列化和反序列化在这篇文章中,我们将为您详细介绍json——pickle的序列化和反序列化的方方面面,并解答jsonproperty反序列化常见的疑惑

在本文中,我们将带你了解json —— pickle 的序列化和反序列化在这篇文章中,我们将为您详细介绍json —— pickle 的序列化和反序列化的方方面面,并解答jsonproperty反序列化常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的.NET中JSON的序列化和反序列化的几种方式、ASP.NET中JSON的序列化和反序列化、ASP.NET中JSON的序列化和反序列化使用说明、ASPNET中JSON的序列化和反序列化的方法

本文目录一览:

json —— pickle 的序列化和反序列化(jsonproperty反序列化)

json —— pickle 的序列化和反序列化(jsonproperty反序列化)

前言json的序列化和反序列化

 1, json 只能序列化简单的数据类型,如,列表,字典,字符串,等简单的类型,不能序列化复杂的类型。

 2, json 是支持所有的语言的,多以我们跨语言的时候都是用json,(和其他语言交互)

 

json 序列化

json的序列化

json.dumps()

 

import json
info = {
''zhang'':''123'',
''qing'':''456''
}
f = open(''json_wenjian'',''w'',encoding=''utf-8'')
f.write(json.dumps(info))
 

 

json的反序列化

json.loads()

 

import json
f = open(''json_wenjian'',''r'',encoding=''utf-8'')
data = json.loads(f.read())
print(data)

 

json小结

  loads ------dumps  和 load-------dump   是成对出现的。

  方式只有点一不一样。 

前言pickle的序列化

  pickle可以序列化python中所有的数据类型,包括函数、类等,下面我们就来看看,如何序列化函数的。还有就是,pickle序列化的是字节,而json序列化的是字符,这个要注意一下

 

pickle的序列化和反序列化

 序列化

import pickle

def fun():
    print(''hello,world'')

info = {
    ''zhang'':123,
    ''qing'':456,
    ''yao'':fun
}

with open(''pickle_wenjian'',''wb'') as f:
    data = pickle.dumps(info)
    f.write(data)

反序列化

 

import pickle

def fun():
    print(''hello,world'')



with open(''pickle_wenjian'',''rb'') as f:
    data = pickle.loads(f.read())
print(data)

 

小结:

  1. son值支持简单的数据类型,pickle支持所有的数据类型。
  2. pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
  3. pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着心的函数体走的。
  4. pickle和json在3.0中只能dump一次和load一次,在2.7里面可以dump多次,load多次,anyway,以后只记住,只需要dump一次,load一次就可以了。

  

 

.NET中JSON的序列化和反序列化的几种方式

.NET中JSON的序列化和反序列化的几种方式

一、什么是JSON

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立 于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升 网络传输效率。

是JavaScript用来处理数据的一种格式,大部分是用来处理JavaScript和web服务器端之间的数据交换,把后台web服务器的数据传递到前台,然后使用JavaScript进 行处理,例如ajax等,是独立于语言和平台的轻量级的数据交换格式。

二、JSON语法

1、JSON语法规则

JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:

  1. 对象表示为键值对
  2. 数据由逗号分隔
  3. 花括号保存对象
  4. 方括号保存数组

对象:对象在JS中是使用花括号包裹{}起来的内容,数据结构为{key1:value1, key2:value2, ...}的键值对结构。在面向对象的语言中,key为对象的属性, value为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。

{"firstName": "Brett", "lastName": "McLaughlin"}

数组:数组在JS中是方括号[]包裹起来的内容,数据结构为[".NET", "Javascript", "Python", ...]的索引结构。在JS中,数组是一种比较特殊的数据类型,它也可 以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。

{
  "people": [{
      "firstName": "zhang",
      "lastName": "san"
    },
    {
      "firstName": "li",
      "lastName": "si"
    }
  ]
}

2、JSON 键/值对

JSON键值对是用来保存JS对象的一种方式,和JS对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号""包裹,使用冒号:分隔,然后紧接着值:  { " firstName " : " Json " } , 这很容易理解,等价于这条 JavaScript 语句:  {firstName : " Json " } 

3、JSON 与 JS 对象的关系

JS对象的关系,可以这么理解:JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。如:

var obj = {a: ''Hello'', b: ''World''};    //这是一个对象,注意键名也是可以使用引号包裹的
var json = ''{"a": "Hello", "b": "World"}''; //这是一个 JSON 字符串,本质是一个字符串

4、JSON 和 JS 对象互转

要实现从对象转换为 JSON 字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({a: ''Hello'', b: ''World''}); //结果是 ''{"a": "Hello", "b": "World"}''

要实现从 JSON 转换为对象,使用 JSON.parse() 方法:

var obj = JSON.parse(''{"a": "Hello", "b": "World"}''); //结果是 {a: ''Hello'', b: ''World''}

三、Json序列化方式

1、JavaScriptSerializer

使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中。

using System.Web.Script.Serialization;

PS: 可用[ScriptIgnore] 标记不序列化的属性

Code:

public ActionResult GetJsonDemo()
{
  //对象
  DataModel model = new DataModel();
  model.ID = 1;
  model.Name = "ZhangSan";
  model.Sex = "女";
  model.Age = 18;

  //对象序列化Json
  string strJson= JsonHelper.ObjectToJson(model);

  //Json反序列化对象
  model= JsonHelper.JsonToObject<DataModel>(strJson);

  string strContent = "对象序列化:" + strJson + "\n"+
            "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age;
  return Content(strContent);
}

JsonHelper:

public class JsonHelper
{
  #region 第一种 JavaScriptSerializer 
  //使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中 
  //using System.Web.Script.Serialization;
  //注:可用[ScriptIgnore] 标记不序列化的属性
  /// <summary>
  /// 序列化
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static string ObjectToJson(object obj)
  {
    JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();
    return jsonSerialize.Serialize(obj);
  }

  /// <summary>
  /// 反序列化
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="strJson"></param>
  /// <returns></returns>
  public static T JsonToObject<T>(string strJson)
  {
    JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();
    //jsonSerialize.Deserialize<dynamic>(strJson); //取值model["Name"]; 要使用索引取值,不能使用对象.属性
    return jsonSerialize.Deserialize<T>(strJson);
  }
  #endregion
}

Result:

 

2、JSON.NET

使用Json.NET类库需要引入的命名空间 using Newtonsoft.Json;

PS: 可用[JsonIgnore]标记不序列化的属性

Code:

public ActionResult GetJsonDemo()
{
  //对象
  DataModel model = new DataModel();
  model.ID = 2;
  model.Name = "LiSi";
  model.Sex = "男";
  model.Age = 20;

  //对象序列化Json
  string strJson = JsonHelper.ObjectToJson(model);

  //Json反序列化对象
  model = JsonHelper.JsonToObject<DataModel>(strJson);

  string strContent = "对象序列化:" + strJson + "\n" +
            "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age;
  return Content(strContent);
}

JsonHelper:

/// <summary>
/// Json 帮助类
/// </summary>
public class JsonHelper
{
  #region 第二种 JSON.NET 
  //使用Json.NET类库需要引入的命名空间 using Newtonsoft.Json;
  //注:可用[JsonIgnore]标记不序列化的属性

  /// <summary>
  /// 序列化
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static string ObjectToJson(object obj)
  {
    return JsonConvert.SerializeObject(obj);
  }

  /// <summary>
  /// 反序列化
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="strJson"></param>
  /// <returns></returns>
  public static T JsonToObject<T>(string strJson)
  {
    return JsonConvert.DeserializeObject<T>(strJson);
  }
  #endregion
}

Result:

 

3、DataContractJsonSerializer

使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中。

using System.Runtime.Serialization.Json;

实体中的契约[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的,对于其他两种方式可加可不加。

PS: 可用[IgnoreDataMember] 标记不序列化的属性

Code:

public ActionResult GetJsonDemo()
{
  //对象
  DataModel model = new DataModel();
  model.ID = 3;
  model.Name = "Wangwu";
  model.Sex = "女";
  model.Age = 22;

  //对象序列化Json
  string strJson = JsonHelper.ObjectToJson(model);

  //Json反序列化对象
  model = JsonHelper.JsonToObject<DataModel>(strJson);

  string strContent = "对象序列化:" + strJson + "\n" +
            "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age;
  return Content(strContent);
}

JsonHelper:

/// <summary>
/// Json 帮助类
/// </summary>
public class JsonHelper
{
 #region 第三种 DataContractJsonSerializer
 //使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中
 //using System.Runtime.Serialization.Json;
 //注:可用[IgnoreDataMember] 标记不序列化的属性
 //实体中的契约[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的
 //对于其他两种方式不必加,也可以的。
 
 /// <summary>
 /// 序列化
 /// </summary>
 /// <param name="obj"></param>
 /// <returns></returns>
 public static string ObjectToJson(object obj)
 {
   using (MemoryStream stream = new MemoryStream())
   {
     DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(obj.GetType());
     jsonSerialize.WriteObject(stream, obj);
     return Encoding.UTF8.GetString(stream.ToArray());
   }
 }
 
 /// <summary>
 /// 反序列化
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="strJson"></param>
 /// <returns></returns>
 public static T JsonToObject<T>(string strJson)
 {
   using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(strJson)))
   {
     DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(typeof(T));
     return (T)jsonSerialize.ReadObject(stream);
   }
 }
 
 #endregion
}

Result:

 

PS: DataModel

[DataContract]
public class DataModel
{
  [DataMember]
  public int ID { get; set; }

  [DataMember]
  public string Name { get; set; }

  [DataMember]
  public string Sex { get; set; }

  [DataMember]
  public int Age { get; set; }
}

四、总结

1、JSON序列化有三种方式

  1. JavaScriptSerializer类
  2. JSON.NET类库
  3. DataContractJsonSerializer类

2、尽量使用JSON.NET(开源)来序列化和反序列化,性能好。

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

您可能感兴趣的文章:
  • Python 之 Json序列化嵌套类方式
  • Python 将json序列化后的字符串转换成字典(推荐)
  • SpringBoot Redis配置Fastjson进行序列化和反序列化实现
  • jQuery序列化form表单数据为JSON对象的实现方法
  • 特殊字符的json序列化总结大全
  • golang如何自定义json序列化应用详解
  • C#实体对象序列化成Json并让字段的首字母小写的两种解决方法
  • JSON序列化Redis读取出错问题解决方案

ASP.NET中JSON的序列化和反序列化

ASP.NET中JSON的序列化和反序列化

导读:json是专门为浏览器中的网页上运行的javascript的代码而设计的一种数据格式在网站应用中使用json的场景越来越多,本文介绍asp.net中json的序列化和反序列化,主要对json的简单介绍,asp.net如何序列化和反序列化的处理,在序列化和反序列化对日期时间,集合,字典的处理。

一,JSON简介

JSON(JavaScript对象符号,JavaScript的对象表示法)是一种轻量级的数据交换格式。

JSON是“名值对”的集合结构由大括号“{}”中括号“[]”,逗号“,”,冒号。“:”双引号''“,”''组成,包含的数据类型有对象,数字,布尔值,字符串数组,NULL等。

JSON具有以下的形式:

对象(对象)是一个无序的“名值对”集合,一个对象以“{”开始,“}”结束每个“名”后跟着一个“:”,多个“名值对”由逗号分隔如:

VAR用户= {“名”:“张三”,“性别”:“男”,“生日”:“1980年8月8日”}

数组(阵列)是值的有序集合,一个数组以“[”开始,以“]”结束,值之间使用“,”分隔如:

VAR用户列表= [{“用户”:{“名”:“张三”,“性别”:“男”,“生日”:“1980年8月8日”}},{“用户”:{“名” “李四”,“性别”:“男”,“生日”:“1985年5月8日”}}];

字符串(字符串)是由双引号包围的任意数量的的Unicode字符的集合,使用反斜线转义。

二,对JSON数据进行序列化和反序列化

可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,.NET Framework 3.5的包含在System.ServiceModel.Web .dll文件中,需要添加对其的引用; .NET框架4在System.Runtime.Serialization中。

利用DataContractJsonSerializer序列化和反序列化的代码:

   1:使用系统;

   2:使用System.Collections.Generic;

   3:使用System.Linq的;

   4:使用的System.Web;

   5:使用System.Runtime.Serialization.Json;

   6:使用System.IO;

   7:使用System.Text;

   8: 

   9:///

  10:/// JSON序列化和反序列化辅助类

  11:/// 摘要>

  12:公共类JsonHelper

  13:{

  14:///

  15:/// JSON序列化

  16:/// 摘要>

  17:公共静态字符串JsonSerializer (T T)

  18:{

  19:DataContractJsonSerializer SER =新DataContractJsonSerializer(typeof运算(T));

  20:MemoryStream的毫秒=新的MemoryStream();

  21:ser.WriteObject(MS,T);

  22:字符串jsonString = Encoding.UTF8.GetString(ms.ToArray());

  23:ms.Close();

  24:返回jsonString;

  25:}

  26: 

  27:///

  28:/// JSON反序列化

  29:/// 摘要>

  30:公共静态牛逼JsonDeserialize (串jsonString)

  31:{

  32:DataContractJsonSerializer SER =新DataContractJsonSerializer(typeof运算(T));

  33:MemoryStream的毫秒=新的MemoryStream(Encoding.UTF8.GetBytes(jsonString));

  34:T已OBJ =(T)ser.ReadObject(MS);

  35:返回OBJ;

  36:}

  37:}

序列化演示:

简单对象的人:

   1:公共类Person

   2:{

   3:公共字符串名称{; 组; }

   4:公众诠释年龄{搞定; 组; }

   5:}

序列化为JSON字符串:

   1:保护无效的Page_Load(对象发件人,EventArgs的发送)

   2:{

   3:人p =新的Person();

   4:p.Name =“张三”;

   5:p.Age = 28;

   6: 

   7:字符串jsonString = JsonHelper.JsonSerializer (P);

   8:回复于(jsonString);

   9:}

输出结果:

{“时代”:28日,“名”:“张三”}

反序列化演示:

   1:保护无效的Page_Load(对象发件人,EventArgs的发送)

   2:{

   3:字符串jsonString =“{\”年龄\“:28日,\”名称\“:\”张三\“}”;

   4人P = JsonHelper.JsonDeserialize (jsonString);

   5:}

运行结果:

ASP.NET中的JSON序列化和反序列化还可以使用的JavaScriptSerializer,在System.Web.Script.Serializatioin命名空间下,需引用System.Web.Extensions.dll。也可以使用JSON.NET。

三,JSON序列化和反序列化日期时间的处理

JSON格式不直接支持日期和时间.DateTime值值显示为“/日期(700000 + 0500)/”形式的JSON字符串,其中第一个数字(在提供的示例中为700000)是GMT时区中自1970年1月1日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“0500”的部分可选,它指示该时间属于当地类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为UTC。

修改个人类,添加LastLoginTime:

   1:公共类Person

   2:{

   3:公共字符串名称{; 组; }

   4:公众诠释年龄{搞定; 组; }

   5:公共的DateTime LastLoginTime {搞定; 组; }

   6:}

   1:人p =新的Person();

   2:p.Name =“张三”;

   3:p.Age = 28;

   4:p.LastLoginTime = DateTime.Now;

   5: 

   6:字符串jsonString = JsonHelper.JsonSerializer (P);

序列化结果:

{“时代”:28日,“LastLoginTime”:“\ /日期(1294499956278 + 0800)\ /”,“姓名”:“张三”}

1.在后台使用正则表达式对其替换处理修改JsonHelper:

   1:使用系统;

   2:使用System.Collections.Generic;

   3:使用System.Linq的;

   4:使用的System.Web;

   5:使用System.Runtime.Serialization.Json;

   6:使用System.IO;

   7:使用System.Text;

   8:使用System.Text.RegularExpressions;

   9: 

  10:///

  11:/// JSON序列化和反序列化辅助类

  12:/// 摘要>

  13:公共类JsonHelper

  14:{

  15:///

  16:/// JSON序列化

  17:/// 摘要>

  18:公共静态字符串JsonSerializer (T T)

  19:{

  20:DataContractJsonSerializer SER =新DataContractJsonSerializer(typeof运算(T));

  21:MemoryStream的毫秒=新的MemoryStream();

  22:ser.WriteObject(MS,T);

  23:字符串jsonString = Encoding.UTF8.GetString(ms.ToArray());

  24:ms.Close();

  25://替换的Json的日期字符串

  26:串P = @“ \\ /日期\((\ D +)\ + \ D + \)\\ / ”;

  27:MatchEvaluator matchEvaluator =新MatchEvaluator(ConvertJsonDateToDateString);

  28:正则表达式章=新的正则表达式(P);

  29:jsonString = reg.Replace(jsonString,matchEvaluator);

  30:返回jsonString;

  31:}

  32: 

  33:///

  34:/// JSON反序列化

  35:/// 摘要>

  36:公共静态牛逼JsonDeserialize (串jsonString)

  37:{

  38://将“YYYY-MM-DD HH:MM:SS”格式的字符串转为“\ /日期(1294499956278 + 0800)\ /”格式

  39:串P = @“\ D {4} - \ d {2} - \ d {2} \ S \ D {2}:\ D {2}:\ D {2}”;

  40:MatchEvaluator matchEvaluator =新MatchEvaluator(ConvertDateStringToJsonDate);

  41:正则表达式章=新的正则表达式(P);

  42:jsonString = reg.Replace(jsonString,matchEvaluator);

  43:DataContractJsonSerializer SER =新DataContractJsonSerializer(typeof运算(T));

  44:MemoryStream的毫秒=新的MemoryStream(Encoding.UTF8.GetBytes(jsonString));

  45:T已OBJ =(T)ser.ReadObject(MS);

  46:返回OBJ;

  47:}

  48: 

  49:///

  50:///将Json的序列化的时间由/日期(1294499956278 + 0800)转为字符串

  51:/// 摘要>

  52:私人静态字符串ConvertJsonDateToDateString(赛米)

  53:{

  54:字符串结果=的String.Empty;

  55:DateTime的DT =新日期时间(1970,1,1);

  56:DT = dt.AddMilliseconds(long.Parse(m.Groups [1] .value的));

  57:DT = dt.ToLocalTime();

  58:结果= dt.ToString(“YYYY-MM-DD HH:MM:SS”);

  59:返回结果;

  60:}

  61: 

  62:///

  63:///将时间字符串转为Json的时间

  64:/// 摘要>

  65:私人静态字符串ConvertDateStringToJsonDate(赛米)

  66:{

  67:字符串结果=的String.Empty;

  68:DateTime的DT = DateTime.Parse(m.Groups [0] .value的);

  69:DT = dt.ToUniversalTime();

  70:时间跨度TS = DT - DateTime.Parse(“1970-01-01”);

  71:结果=的String.Format(“ \\ /日期({0} +0800)\\ /”,ts.TotalMilliseconds);

  72:返回结果;

  73:}

  74:}

序列化演示:

   1:人p =新的Person();

   2:p.Name =“张三”;

   3:p.Age = 28;

   4:p.LastLoginTime = DateTime.Now;

   5: 

   6:字符串jsonString = JsonHelper.JsonSerializer (P);

运行结果:

{“时代”:28日,“LastLoginTime”:“2011-01-09一点○○分56秒”,“姓名”:“张三”}

反序列化演示:

JSON字符串=“{\”年龄\“:28日,\”LastLoginTime \“:\”2011-01-09 00:30:00 \“,\”名称\“:\”张三\“}”;

P = JsonHelper.JsonDeserialize (JSON);

运行结果:

在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。

2.利用JavaScript的处理

   1:功能ChangeDateFormat(jsondate){

   2:jsondate = jsondate.replace(“/日期(”,“”).replace(“)/”,“”);

   3:如果(jsondate.indexOf(“+”)> 0){

   4:jsondate = jsondate.substring(0,jsondate.indexOf(“+”));

   5:}

   6:否则如果(jsondate.indexOf(“ - ”)> 0){

   7:jsondate = jsondate.substring(0,jsondate.indexOf(“ - ”));

   8:}

   9: 

  10:VAR日期=新的日期(parseInt函数(jsondate,10));

  11:无功一个月= date.getMonth()+ 1

  12:VAR的currentdate = date.getDate()

  13:返回date.getFullYear()+“ - ”+月+“ - ”+的currentdate;

  14:}

简单演示:

ChangeDateFormat(“\ /日期(1294499956278 + 0800)\ /”);

结果:

四,JSON序列化和反序列化集合,字典,数组的处理

在JSON数据中,所有的集合,字典和数组都表示为数组。

名单序列化:

   1:名单列表=新的List ()

   2:{

   3:新的Person(){名称=“张三”,年龄= 28},

   4:新的Person(){名称=“李四”,年龄= 25}

   5:};

   6: 

   7:字符串jsonString = JsonHelper.JsonSerializer >(名单);

序列化结果:

“[{\”年龄\“:28日,\”名称\“:\”张三\“},{\”年龄\“:25,\”名称\“:\”李四\“}]”

字典不能直接用于JSON,字典字典转化为JSON并不是跟原来的字典格式一致,而是形式以词典的按键作为名称“密钥”的值,以字典的值作为名称为“值”的值。如:

   1:词典 DIC =新词典();

   2:dic.Add(“姓名”,“张三”);

   3:dic.Add(“时代”,“28”);

   4: 

   5:字符串jsonString = JsonHelper.JsonSerializer >(DIC);

序列化结果:

   1:“[{\”键\“:\”名称\“,\”价值\“:\”张三\“},{\”键\“:\”年龄\“,\”价值\“: \“28 \”}]“

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

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

在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间、集合、字典的处理。
一、JSON简介
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。
JSON是“名值对”的集合。结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'“”'组成,包含的数据类型有Object,Number,Boolean,String,Array,NULL等。
JSON具有以下的形式:
对象(Object)是一个无序的“名值对”集合,一个对象以”{”开始,”}”结束。每个“名”后跟着一个”:”,多个“名值对”由逗号分隔。如:
var user={"name":"张三","gender":"男","birthday":"1980-8-8"}
数组(Array)是值的有序集合,一个数组以“[”开始,以“]”结束,值之间使用“,”分隔。如:
var userlist=[{"user":{"name":"张三","birthday":"1980-8-8"}},{"user":{"name":"李四","birthday":"1985-5-8"}}];
字符串(String)是由双引号包围的任意数量的Unicode字符的集合,使用反斜线转义。
二、对JSON数据进行序列化和反序列化
可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。 DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加对其的引用;.NET Framework 4在System.Runtime.Serialization中。
利用DataContractJsonSerializer序列化和反序列化的代码:
复制代码 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
/// <summary>
/// JSON序列化和反序列化辅助类
/// </summary>
public class JsonHelper
{
/// <summary>
/// JSON序列化
/// </summary>
public static string JsonSerializer<T>(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms,t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return jsonString;
}
/// <summary>
/// JSON反序列化
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.Readobject(ms);
return obj;
}
}

序列化Demo:
简单对象Person:
复制代码 代码如下:

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

序列化为JSON字符串:
复制代码 代码如下:

protected void Page_Load(object sender,EventArgs e)
{
Person p = new Person();
p.Name = "张三";
p.Age = 28;
string jsonString = JsonHelper.JsonSerializer<Person>(p);
Response.Write(jsonString);
}

输出结果:
{"Age":28,"Name":"张三"}
反序列化Demo:
复制代码 代码如下:

protected void Page_Load(object sender,EventArgs e)
{
string jsonString = "{\"Age\":28,\"Name\":\"张三\"}";
Person p = JsonHelper.JsonDeserialize<Person>(jsonString);
}

运行结果:
ASP.NET中的JSON序列化和反序列化还可以使用JavaScriptSerializer,在 System.Web.Script.Serializatioin命名空间下,需引用System.Web.Extensions.dll.也可以使用 JSON.NET.
三、JSON序列化和反序列化日期时间的处理
JSON格式不直接支持日期和时间。DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提 供的示例中为 700000)是 GMT 时区中自 1970 年 1 月 1 日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“+0500”的部分可选,它指示该时间属于Local 类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为Utc。
修改Person类,添加LastLoginTime:
复制代码 代码如下:

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime LastLoginTime { get; set; }
}
Person p = new Person();
p.Name = "张三";
p.Age = 28;
p.LastLoginTime = DateTime.Now;
string jsonString = JsonHelper.JsonSerializer<Person>(p);

序列化结果:
{"Age":28,"LastLoginTime":"\/Date(1294499956278+0800)\/","Name":"张三"}
1. 在后台使用正则表达式对其替换处理。修改JsonHelper:
复制代码 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
/// <summary>
/// JSON序列化和反序列化辅助类
/// </summary>
public class JsonHelper
{
/// <summary>
/// JSON序列化
/// </summary>
public static string JsonSerializer<T>(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms,t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
//替换Json的Date字符串
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDatetoDateString);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString,matchEvaluator);
return jsonString;
}
/// <summary>
/// JSON反序列化
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{
//将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString,matchEvaluator);
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.Readobject(ms);
return obj;
}
/// <summary>
/// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
/// </summary>
private static string ConvertJsonDatetoDateString(Match m)
{
string result = string.Empty;
DateTime dt = new DateTime(1970,1,1);
dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
dt = dt.ToLocalTime();
result = dt.ToString("yyyy-MM-dd HH:mm:ss");
return result;
}
/// <summary>
/// 将时间字符串转为Json时间
/// </summary>
private static string ConvertDateStringToJsonDate(Match m)
{
string result = string.Empty;
DateTime dt = DateTime.Parse(m.Groups[0].Value);
dt = dt.ToUniversalTime();
TimeSpan ts = dt - DateTime.Parse("1970-01-01");
result = string.Format("\\/Date({0}+0800)\\/",ts.TotalMilliseconds);
return result;
}
}

序列化Demo:
复制代码 代码如下:

Person p = new Person();
p.Name = "张三";
p.Age = 28;
p.LastLoginTime = DateTime.Now;
string jsonString = JsonHelper.JsonSerializer<Person>(p);

运行结果:
{"Age":28,"LastLoginTime":"2011-01-09 01:00:56","Name":"张三"}
反序列化Demo:
string json = "{\"Age\":28,\"LastLoginTime\":\"2011-01-09 00:30:00\",\"Name\":\"张三\"}";
p=JsonHelper.JsonDeserialize<Person>(json);
运行结果:
在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。
2. 利用JavaScript处理
复制代码 代码如下:

function ChangeDateFormat(jsondate) {
jsondate = jsondate.replace("/Date(","").replace(")/","");
if (jsondate.indexOf("+") > 0) {
jsondate = jsondate.substring(0,jsondate.indexOf("+"));
}
else if (jsondate.indexOf("-") > 0) {
jsondate = jsondate.substring(0,jsondate.indexOf("-"));
}
var date = new Date(parseInt(jsondate,10));
var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
return date.getFullYear() + "-" + month + "-" + currentDate;
}

简单Demo :
ChangeDateFormat("\/Date(1294499956278+0800)\/");
结果:
四、JSON序列化和反序列化集合、字典、数组的处理
在JSON数据中,所有的集合、字典和数组都表示为数组。
List<T>序列化:
复制代码 代码如下:

List<Person> list = new List<Person>()
{
new Person(){ Name="张三",Age=28},
new Person(){ Name="李四",Age=25}
};
string jsonString = JsonHelper.JsonSerializer<List<Person>>(list);

序列化结果:
"[{\"Age\":28,\"Name\":\"张三\"},{\"Age\":25,\"Name\":\"李四\"}]"
字典不能直接用于JSON,Dictionary字典转化为JSON并不是跟原来的字典格式一致,而是形式以Dictionary的Key作为名称”Key“的值,以Dictionary的Value作为名称为”Value“的值 。如:
Dictionary<string,string> dic = new Dictionary<string,string>();
dic.Add("Name","张三");
dic.Add("Age","28");
string jsonString = JsonHelper.JsonSerializer < Dictionary<string,string>>(dic);
序列化结果:
"[{\"Key\":\"Name\",\"Value\":\"张三\"},{\"Key\":\"Age\",\"Value\":\"28\"}]"

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

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

一、JSON简介

 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。

JSON是“名值对”的集合。结构由大括号''{}'',中括号''[]'',逗号'','',冒号'':'',双引号''“”''组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。

JSON具有以下的形式:

对象(Object)是一个无序的“名值对”集合,一个对象以”{”开始,”}”结束。每个“名”后跟着一个”:”,多个“名值对”由逗号分隔。如:

var user={"name":"张三","gender":"男","birthday":"1980-8-8"}

数组(Array)是值的有序集合,一个数组以“[”开始,以“]”结束,值之间使用“,”分隔。如:

复制代码 代码如下:

var userlist=[{"user":{"name":"张三","gender":"男","birthday":"1980-8-8"}},{"user":{"name":"李四","gender":"男","birthday":"1985-5-8"}}];

 字符串(String)是由双引号包围的任意数量的Unicode字符的集合,使用反斜线转义。

二、对JSON数据进行序列化和反序列化

可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。DataContractJsonSerializer在SystemRuntimeSerializationJson命名空间下,NET Framework 5包含在SystemServiceModelWebdll中,需要添加对其的引用;NET Framework 4在SystemRuntimeSerialization中。

利用DataContractJsonSerializer序列化和反序列化的代码:

using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemWeb;
using SystemRuntimeSerializationJson;
using SystemIO;
using SystemText;
 /// <summary>
 /// JSON序列化和反序列化辅助类
/// </summary>
 public class JsonHelper
{
  /// <summary>
  /// JSON序列化
  /// </summary>
  public static string JsonSerializer<T>(T t)
  {
   DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
   MemoryStream ms = new MemoryStream();
   serWriteObject(ms, t);
   string jsonString = EncodingUTFGetString(msToArray());
   msClose();
   return jsonString;
  } 
  /// <summary>
  /// JSON反序列化
  /// </summary>
  public static T JsonDeserialize<T>(string jsonString)
  {
   DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
   MemoryStream ms = new MemoryStream(EncodingUTFGetBytes(jsonString));
   T obj = (T)serReadObject(ms);
   return obj;
  }
 }

序列化Demo:

简单对象Person:

  public class Person
 {
  public string Name { get; set; }
  public int Age { get; set; }
 }

序列化为JSON字符串:

 protected void Page_Load(object sender, EventArgs e)
{
 Person p = new Person();
 pName = "张三";
  pAge = 28; 
 string jsonString = JsonHelperJsonSerializer<Person>(p);
  ResponseWrite(jsonString);
 }

输出结果:

{"Age":28,"Name":"张三"} 

反序列化Demo:

  protected void Page_Load(object sender, EventArgs e)
{
  string jsonString = "{\"Age\":28,\"Name\":\"张三\"}";
  Person p = JsonHelper.JsonDeserialize<Person>(jsonString);
}

运行结果:

ASP.NET中的JSON序列化和反序列化还可以使用JavaScriptSerializer,在System.Web.Script.Serializatioin命名空间下,需引用System.Web.Extensions.dll.也可以使用JSON.NET.

三、JSON序列化和反序列化日期时间的处理

JSON格式不直接支持日期和时间。DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提供的示例中为 700000)是 GMT 时区中自 1970 年 1 月 1 日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“+0500”的部分可选,它指示该时间属于Local类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为Utc。

修改Person类,添加LastLoginTime:

  public class Person
 {
 public string Name { get; set; }
  public int Age { get; set; }
  public DateTime LastLoginTime { get; set; }
 }
 Person p = new Person();
 p.Name = "张三";
 p.Age = 28;
 p.LastLoginTime = DateTime.Now; 
 string jsonString = JsonHelper.JsonSerializer<Person>(p);

序列化结果:

{"Age":28,"LastLoginTime":"\/Date(1294499956278+0800)\/","Name":"张三"}

1 、在后台使用正则表达式对其替换处理。修改JsonHelper:

  using System;
 using SystemCollectionsGeneric;
 using SystemLinq;
 using SystemWeb;
 using SystemRuntimeSerializationJson;
 using SystemIO;
 using SystemText;
 using SystemTextRegularExpressions;
  
 /// <summary>
 /// JSON序列化和反序列化辅助类
 /// </summary>
 public class JsonHelper
 {
  /// <summary>
  /// JSON序列化
  /// </summary>
  public static string JsonSerializer<T>(T t)
  {
   DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
   MemoryStream ms = new MemoryStream();
   serWriteObject(ms, t);
   string jsonString = EncodingUTFGetString(msToArray());
   msClose();
   //替换Json的Date字符串
   string p = @"\\/Date\((\d+)\+\d+\)\\/";
   MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
   Regex reg = new Regex(p);
   jsonString = regReplace(jsonString, matchEvaluator);
   return jsonString;
  }
 
  /// <summary>
  /// JSON反序列化
  /// </summary>
  public static T JsonDeserialize<T>(string jsonString)
  {
   //将"yyyy-MM-dd HHmmss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
   string p = @"\d{4}-\d{2}-\d{2}\s\d{2}\d{2}\d{2}";
   MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
   Regex reg = new Regex(p);
   jsonString = regReplace(jsonString, matchEvaluator);
   DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
   MemoryStream ms = new MemoryStream(EncodingUTFGetBytes(jsonString));
   T obj = (T)serReadObject(ms);
   return obj;
  }
 
  /// <summary>
  /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
  /// </summary>
  private static string ConvertJsonDateToDateString(Match m)
  {
   string result = stringEmpty;
   DateTime dt = new DateTime(1970,1,1);
   dt = dtAddMilliseconds(longParse(mGroups[1]Value));
   dt = dtToLocalTime();
   result = dtToString("yyyy-MM-dd HHmmss");
   return result;
  }
 
  /// <summary>
  /// 将时间字符串转为Json时间
  /// </summary>
  private static string ConvertDateStringToJsonDate(Match m)
  {
   string result = stringEmpty;
   DateTime dt = DateTimeParse(mGroups[0]Value);
   dt = dtToUniversalTime();
   TimeSpan ts = dt - DateTimeParse("1970-01-01");
   result = stringFormat("\\/Date({0}+0800)\\/",tsTotalMilliseconds);
   return result;
  }
 }

序列化Demo:

  Person p = new Person();
 p.Name = "张三";
 p.Age = 28;
 p.LastLoginTime = DateTime.Now; 
 string jsonString = JsonHelper.JsonSerializer<Person>(p);

 运行结果:

{"Age":28,"LastLoginTime":"2011-01-09 01:00:56","Name":"张三"}

反序列化Demo:

string json = "{\"Age\":28,\"LastLoginTime\":\"2011-01-09 00:30:00\",\"Name\":\"张三\"}";
p=JsonHelper.JsonDeserialize<Person>(json);

运行结果:


在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。

2、利用JavaScript处理   

 function ChangeDateFormat(jsondate) {
  jsondate = jsondate.replace("/Date(", "").replace(")/", "");
  if (jsondate.indexOf("+") > 0) {
   jsondate = jsondate.substring(0, jsondate.indexOf("+"));
  }
  else if (jsondate.indexOf("-") > 0) {
   jsondate = jsondate.substring(0, jsondate.indexOf("-"));
  }
  
  var date = new Date(parseInt(jsondate, 10));
  var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) date.getMonth() + 1;
  var currentDate = date.getDate() < 10 ? "0" + date.getDate() date.getDate();
  return date.getFullYear() + "-" + month + "-" + currentDate;
 }

 简单Demo :

ChangeDateFormat("\/Date(1294499956278+0800)\/");

结果:

2011-1-8

四、JSON序列化和反序列化集合、字典、数组的处理

 在JSON数据中,所有的集合、字典和数组都表示为数组。

List<T>序列化:

  List<Person> list = new List<Person>()
 {
  new Person(){ Name="张三", Age=28},
  new Person(){ Name="李四", Age=25}
 };
string jsonString = JsonHelper.JsonSerializer<List<Person>>(list);

序列化结果:

"[{\"Age\":28,\"Name\":\"张三\"},{\"Age\":25,\"Name\":\"李四\"}]"

字典不能直接用于JSON,Dictionary字典转化为JSON并不是跟原来的字典格式一致,而是形式以Dictionary的Key作为名称”Key“的值,以Dictionary的Value作为名称为”Value“的值 。如:

  Dictionary<string, string> dic = new Dictionary<string, string>();
 dic.Add("Name", "张三");
 dic.Add("Age", "28");
 string jsonString = JsonHelper.JsonSerializer < Dictionary<string, string>>(dic);

序列化结果:

 "[{\"Key\":\"Name\",\"Value\":\"张三\"},{\"Key\":\"Age\",\"Value\":\"28\"}]"

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

您可能感兴趣的文章:
  • jquery利用json实现页面之间传值的实例解析
  • php+ajax+json 详解及实例代码
  • C#中实现Json序列化与反序列化的几种方式
  • js中动态创建json,动态为json添加属性、属性值的实例
  • AngularJS中的JSONP实例解析
  • 将JSON字符串转换成Map对象的方法
  • 文件缓存(配合JSON数组)
  • IOS开发之JSON转PLIST实例详解
  • javascript学习之json入门

关于json —— pickle 的序列化和反序列化jsonproperty反序列化的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.NET中JSON的序列化和反序列化的几种方式、ASP.NET中JSON的序列化和反序列化、ASP.NET中JSON的序列化和反序列化使用说明、ASPNET中JSON的序列化和反序列化的方法的相关信息,请在本站寻找。

本文标签: