JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用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":"张三","gender":"男","birthday":"1980-8-8"}},{"user":{"name":"李四","gender":"男","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)\/");

  结果: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\"}]"

  JSON官网:http://www.json.org/json-zh.html

  独立JSON序列化:http://msdn.microsoft.com/zh-cn/library/bb412170.aspx

  如何对JSON序列化和反序列化:http://msdn.microsoft.com/zh-cn/library/bb412179.aspx

一起谈.NET技术,ASP.NET 中JSON 的序列化和反序列化相关推荐

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

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  2. 转载:ASP.NET中JSON的序列化和反序列化

    http://www.cnblogs.com/zhaozhan/archive/2011/01/09/1931340.html http://hi.baidu.com/%B1%F9%D1%A9%D2% ...

  3. ASP.NET MVC Json的序列化和反序列化

    1.利用js进行序列化成字符串和反序列化 1 var personObj = {name:"Tom",age:16}; 2 3 // 利用JS序列化成字符串 4 var perso ...

  4. python序列化和反序列化_Python 中 json 数据序列化和反序列化

    1.Json 定义 定义:JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.JSON 的数据格式其实就是 python 里面的字典格式,里 ...

  5. c语言josn序列化和反序列化,Flutter 中 JSON 的序列化和反序列化

    前言 Flutter 中没有类似于 Java 中 Gson/Jackson 这样的 JSON 序列化库. 因为这些库都是通过反射实现的,而 Flutter 中不支持反射. 其实 Dart 是支持反射的 ...

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

    .NET 中有两种方法进行JSON的操作分别需要引用不同的命名空间 1.System.Runtime.Serialization.Json(System.Runtime.Serialization.d ...

  7. 计算机技术在现代地球科学中的重要性,浅谈GIS技术在地球科学中的应用.doc

    浅谈GIS技术在地球科学中的应用.doc 浅谈GIS技术在地球科学中的应用 中图分类号:P9 文献标识码:A 文章编号:1007-0745(2014)02-0181-01 摘要:地理信息系统是指带各种 ...

  8. C#中的Json的序列化和反序列化

    Json是一种通用的数据格式,我们在数据交换的时候,经常会用到,下面介绍c#中的json序列化和反序列化,当然也可用在asp.net,silverlight,wpf中.我们在下面实例讲解如何进行Jso ...

  9. ASP.NET Core 3.1系列(30)——Newtonsoft.Json实现JSON的序列化和反序列化

    1.前言 在早期版本的ASP.NET Core项目中,Newtonsoft.Json的使用率非常高.虽然微软当前主推System.Text.Json来处理JSON的序列化和反序列化,但Newtonso ...

最新文章

  1. ISP采用的 ISIS链接状态路由协议
  2. docker 部署nginx 使用keepalived 部署高可用
  3. java版电子商务spring cloud分布式微服务b2b2c社交电商(四)SpringBoot 整合JPA
  4. android 中radiogroup滑动切换,巧妙实现缺角radiogroup控制多个fragment切换和滑动
  5. Windows2003系统无法运行CS游戏的解决方案
  6. 嵌入式操作系统开发板中的串口编程——光敏电阻数据读取
  7. 打算考PMP,需要准备什么材料?
  8. 单片机 C语言 读引脚,单片机引脚读写操作
  9. Android系统预装Chrome并自定义主页
  10. 【UOJ449】【集训队作业2018】喂鸽子(概率DP)
  11. 东周科目三考场5号线_光明东周科目三考场,5条道图纸心得分享
  12. MongoDB简单学习小总结
  13. nba球员数据分析和可视化_可视化NBA球员统计
  14. linux后台运行服务
  15. js判断当前设备及获取设备、浏览器的宽度和高度
  16. 计网必会:P2P体系结构,BitTorrent,DHT,分布式散列表
  17. vue里使用quill
  18. bios设置raid启动模式Linux,手把手教你做raid,各主板raid开启设置方法
  19. 单点登录CAS-03:cas配置02-开启/status
  20. 用数据管理过程(3)——可预测级别的量化管理(麦当劳的管理方式)

热门文章

  1. 使用Apache的ab工具进行压力测试
  2. 移动开发之设计稿转换页面单位尺寸
  3. MYSQL 慢查询日志分析
  4. ***引发《唐山大地震》 在线下载瞬间中毒
  5. 为什么zookeeper集群中节点配置个数是奇数个?
  6. Scanner和BufferedReader从控制台读取输入数据
  7. 红帽20亿美元强劲收入的背后,让开源成为主流
  8. ASP.NET Core管道深度剖析
  9. Qt widgets deeps--烧鸡
  10. 导入工程出错原因及解决