使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象 分类: JSON 前端 2014-11-10 10:20 97人阅读 评论(1) 收藏
一、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) 收藏的更多相关文章
- 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兼容所有 ...
- OC基础:类的扩展.协议 分类: ios学习 OC 2015-06-22 19:22 34人阅读 评论(0) 收藏
//再设计一个类的时候,有些方法需要对外公开(接口),有些仅供内部使用. 类的扩展:为类添加新的特征(属性)或者方法 对已知类: 1.直接添加 2.继承(在其子类中添加实例变量和方法) 3.使用ext ...
- OC基础:实例变量和成员变量的区别 分类: ios学习 OC 2015-06-14 17:59 16人阅读 评论(0) 收藏
摘要: Objective-C 引入了"实例变量"的概念,但同时, 也经常出现 "成员变量"的声音. 到底什么是实例变量,什么是成员变量,二者的区别是什么呢 ...
- 将HTML格式的String转化为HTMLElement 分类: C1_HTML/JS/JQUERY 2014-08-05 12:01 1217人阅读 评论(0) 收藏
代码如下: <meta charset="UTF-8"> <title>Insert title here</title> </head& ...
- 解决如下json格式的字符串不能使用DataContractJsonSerializer序列化和反序列化 分类: JSON 2015-01-28 14:26 72人阅读 评论(0) 收藏
可以解决如下json格式的字符串不能使用DataContractJsonSerializer反序列化 { "ss": "sss", " ...
- C#类型 分类: C# 2015-03-09 08:44 202人阅读 评论(0) 收藏
C# 类型 引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又 ...
- FastJSON解析Json字符串(反序列化为List、Map)
在日常开发与数据库打交道的时候,常有以Json格式的字符串存储到数据库的情况,当在Java程序中获取到对应的Json格式的String字符串后,如何才能转换为我们想要的数据格式(比如转换成Java中的 ...
- 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; ...
- 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指针类型不甚理解,因此在 ...
随机推荐
- Unreachable catch block for IOException. This exception is never thrown from the try statement body
Unreachable catch block for IOException. This exception is never thrown from the try statement body ...
- ECSHOP首页调用指定分类下的商品
转:http://bbs.ecshop.com/thread-1123207-1-1.html 调用某个分类下的商品,方法有很多种的,不过都需要先在后台设置模板那里设置显示和显示条数, 然后在需要调用 ...
- java 正则表达式去除标点符号
public class Test { public static void main(String[] args) { String str = "!!!??!!!!%*)%¥!KTV ...
- applicationContext.xml 配置
Hibernate SQL方言 (hibernate.dialect) 数据库 hibernate方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 ...
- POJ -- 2436
Disease Management Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is run ...
- zoj 3805 Machine
Machine Time Limit: 2 Seconds Memory Limit: 65536 KB In a typical assembly line, machines are c ...
- 2013 ACM区域赛长沙 K Pocket Cube hdu 4801
题意:给了一个2*2的魔方..每步操作可以将任意一面翻转90度..现在问在N(<=7)步内.最多能翻出几面相同的. 直接打表模拟每种翻转情况 #include<cstdio> #in ...
- std::move()和std::forward()
std::move(t)负责将t的类型转换为右值引用,这种功能很有用,可以用在swap中,也可以用来解决完美转发. std::move()的源码如下 template<class _Ty> ...
- OJ题目分类
POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...
- Why do we need smart pointer and how to implement it.
Here are two simple questions. Problem A #include <string> include <iostream> using name ...