一、JSON简介

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

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

JSON具有以下的形式:

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

{"FirstName":"Jason","LastName":"Chen"}

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

[{"FirstName":"Jason","LastName":"Chen"},{"FirstName":"Jason","LastName":"Chen"}]

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

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

可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。

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

using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.RegularExpressions;
/*
* DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,
* .NET Framework 3.5包含在System.ServiceModel.Web.dll中;
* .NET Framework 4.0包含在System.Runtime.Serialization中。
* create by cjj on 2014-10-08;email:ijasonchen91@sina.com<span style="font-family: Arial, Helvetica, sans-serif;">。</span>
*/
namespace mob.json
{ /// <summary>
/// JSON序列化和反序列化辅助类
/// </summary>
public class JsonHelper
{
/// <summary>
/// JSON序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static string Serialize<T>(T t)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, t);
string jsonString = Encoding.Default.GetString(ms.ToArray());
ms.Close();
jsonString = ConvertToDateTimeString(jsonString);
return jsonString;
} /// <summary>
/// JSON反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jsonString"></param>
/// <returns></returns>
public static T Deserialize<T>(string jsonString)
{ jsonString = ConvertToJsonDateTimeString(jsonString); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString));
T obj = (T)serializer.ReadObject(ms);
ms.Close();
return obj;
} /// <summary>
/// 将"\/Date(673286400000+0800)\/"Json时间格式替换"yyyy-MM-dd HH:mm:ss"格式的字符串
/// </summary>
/// <param name="jsonDateTimeString">"\/Date(673286400000+0800)\/"Json时间格式</param>
/// <returns></returns>
private static string ConvertToDateTimeString(string jsonDateTimeString)
{
string result = string.Empty;
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
result = reg.Replace(jsonDateTimeString, matchEvaluator);
return result;
} private static string ConvertJsonDateToDateString(Match match)
{
string result = string.Empty;
DateTime dt = new DateTime(1970, 1, 1);
dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value));
dt = dt.ToLocalTime();
result = dt.ToString("yyyy-MM-dd HH:mm:ss");
return result;
} /// <summary>
/// 将"yyyy-MM-dd HH:mm:ss"格式的字符串替换"\/Date(673286400000+0800)\/"Json时间格式
/// </summary>
/// <param name="dateTimeString">"yyyy-MM-dd HH:mm:ss"格式的字符串</param>
/// <returns></returns>
private static string ConvertToJsonDateTimeString(string dateTimeString)
{
string result = string.Empty; 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);
result = reg.Replace(dateTimeString, matchEvaluator);
return result;
} private static string ConvertDateStringToJsonDate(Match match)
{
string result = string.Empty;
DateTime dt = DateTime.Parse(match.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:

[DataContract]
public class Person
{
public Person() { } public Person(string firstname, string lastname, DateTime birthday)
{
this.FirstName = firstname;
this.LastName = lastname;
this.Birthday = birthday;
} [DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public DateTime Birthday { get; set; }
}

序列化为JSON字符串:

private void Serialize()
{
Person p = new Person("Jason", "Chen", Convert.ToDateTime("1991-05-04"));
string jsonString = JsonHelper.Serialize<Person>(p);
Response.Write(jsonString);
}

输出结果:

{"Birthday":"1991-05-04 00:00:00","FirstName":"Jason","LastName":"Chen"}

反序列化Demo:

private static void Deserialize()
{
string jsonString = "{\"FirstName\":\"Jason\",\"LastName\":\"Chen\",\"Birthday\":\"1991-05-04 00:00:00\"}";
Person p = JsonHelper.Deserialize<Person>(jsonString);
}

运行结果:

三、JSON序列化集合、字典、数组的处理

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

List<T>序列化:

private void Serialize()
{
List<Person> list = new List<Person>(){
new Person("Jason", "Chen", Convert.ToDateTime("1991-05-04")),
new Person("Jack", "Chen", Convert.ToDateTime("1991-05-05"))
};
string jsonString = JsonHelper.Serialize<List<Person>>(list);
Response.Write(jsonString);
}

序列化结果:

[{"Birthday":"1991-05-04 00:00:00","FirstName":"Jason","LastName":"Chen"},{"Birthday":"1991-05-05 00:00:00","FirstName":"Jack","LastName":"Chen"}]

Dictionary字典转化为JSON,如:

private void Serialize()
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("FirstName", "Jason");
dic.Add("LastName", "Chen");
string jsonString = JsonHelper.Serialize<Dictionary<string, string>>(dic);
Response.Write(jsonString);
}

序列化结果:

[{"Key":"FirstName","Value":"Jason"},{"Key":"LastName","Value":"Chen"}]

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象 分类: JSON 前端 2014-11-10 10:20 97人阅读 评论(1) 收藏的更多相关文章

  1. OC基础:类和对象 分类: ios学习 OC 2015-06-12 18:55 17人阅读 评论(0) 收藏

    OC:Objective-c     面向对象的c语言,简称obj-c或者OC OC和C的区别 1.OC是C语言的超集,OC是在C语言的基础上结合smalltalk的优点,开发出来的语言.oc兼容所有 ...

  2. OC基础:类的扩展.协议 分类: ios学习 OC 2015-06-22 19:22 34人阅读 评论(0) 收藏

    //再设计一个类的时候,有些方法需要对外公开(接口),有些仅供内部使用. 类的扩展:为类添加新的特征(属性)或者方法 对已知类: 1.直接添加 2.继承(在其子类中添加实例变量和方法) 3.使用ext ...

  3. OC基础:实例变量和成员变量的区别 分类: ios学习 OC 2015-06-14 17:59 16人阅读 评论(0) 收藏

    摘要:  Objective-C  引入了"实例变量"的概念,但同时, 也经常出现 "成员变量"的声音. 到底什么是实例变量,什么是成员变量,二者的区别是什么呢 ...

  4. 将HTML格式的String转化为HTMLElement 分类: C1_HTML/JS/JQUERY 2014-08-05 12:01 1217人阅读 评论(0) 收藏

    代码如下: <meta charset="UTF-8"> <title>Insert title here</title> </head& ...

  5. 解决如下json格式的字符串不能使用DataContractJsonSerializer序列化和反序列化 分类: JSON 2015-01-28 14:26 72人阅读 评论(0) 收藏

    可以解决如下json格式的字符串不能使用DataContractJsonSerializer反序列化 {     "ss": "sss",     " ...

  6. C#类型 分类: C# 2015-03-09 08:44 202人阅读 评论(0) 收藏

    C# 类型 引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又 ...

  7. FastJSON解析Json字符串(反序列化为List、Map)

    在日常开发与数据库打交道的时候,常有以Json格式的字符串存储到数据库的情况,当在Java程序中获取到对应的Json格式的String字符串后,如何才能转换为我们想要的数据格式(比如转换成Java中的 ...

  8. JAVA 对象数组,加载图片实例 分类: Java Game 2014-08-14 16:57 80人阅读 评论(0) 收藏

    主函数: package com.mywork; import java.awt.Color; import java.awt.Image; import javax.swing.ImageIcon; ...

  9. C语言之void类型及void指针 分类: C/C++ 2015-07-13 11:24 8人阅读 评论(0) 收藏

    原文网址:http://www.cnblogs.com/pengyingh/articles/2407267.html 1.概述 许多初学者对C/C 语言中的void及void指针类型不甚理解,因此在 ...

随机推荐

  1. POJ_1065_Wooden_Sticks_(动态规划,LIS+鸽笼原理)

    描述 http://poj.org/problem?id=1065 木棍有重量 w 和长度 l 两种属性,要使 l 和 w 同时单调不降,否则切割机器就要停一次,问最少停多少次(开始时停一次). Wo ...

  2. 微软Sharepoint的一些缺点

    转:http://bbs.tianya.cn/post-144-566491-1.shtml 微软Sharepoint的一些缺点(一) 微软Sharepoint的一些缺点 关于SharePoint,它 ...

  3. “面包屑导航”——SiteMapPath控件的使用(ASP.NET)(转)

    转自:http://www.cnblogs.com/ball-head/archive/2010/09/28/1837253.html 最近在博客里写了一些日志,主要都是我在实际编程过程中遇到的问题. ...

  4. AppFabric 版本区分

    目前CSDN上可以下载到的 AppFabric有两个版本: 1, WindowsServerAppFabricSetup_x64_6.1.exe,    2010/12/3 发布的, 不推荐使用,Wi ...

  5. HDOJ/HDU 1022 Train Problem I(模拟栈)

    Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot o ...

  6. jQuery 参考手册 - 文档操作

    上传图片时页面崩溃..全部付之东流 addClass() after() append() appendTo() attr() before() clone() detach() empty() ha ...

  7. ACM2035_(递归法求幂)

    /* 编写一个递归算法,求解m的n次方. 我们一般求解m的n次方,一般使用n个m相乘的办法来求解. 其实我们还可以使用另外一种更有效率的办法求解这个问题. 我们知道一个数的0次方等于1,一个数的1次方 ...

  8. HOST1PLUS 的 VPS 主機-絕佳的性能和特惠的價格

    HOST1PLUS 的 VPS 主機-絕佳的性能和特惠的價格 undefined Open Container Project undefined 80后美女董事长吴艳:嫁得好不一定比干得好容易 - ...

  9. 近5年133个Java面试问题列表

    Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入. 在我 ...

  10. 3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo

    hadoop中的RPC框架实现机制 RPC是Remotr Process Call, 进程间的远程过程调用,不是在一个jvm里. 即,Controller拿不到Service的实例对象. hadoop ...