相信做 .net 开发的朋友经常会遇到 json 序列化这样的需要,今天发篇文章总结下自己使用ServiceStack.Text 来序列化 json。它的速度比 Newtonsoft.Json 快很多,在测试时发现比 fastJson 还快些。

首先,我们有下边两个类,一个是职员(Staff)类,一个是联系方式(Contact)类:

public class Staff
{
public long ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class Contact
{
public long StaffID { get; set; }
public string Email { get; set; }
}

首先,我们添加两个职员:

List<Staff> listStaff = new List<Staff>();
listStaff.Add(new Staff() { ID = , Name = "小李" });
listStaff.Add(new Staff() { ID = , Name = "小王" });

按以前很多人序列化 json 的方式:

var result = "[";
foreach (var staff in listStaff)
{
result += "{\"ID\":\"" + staff.ID + "\",\"Name\":\"" + staff.Name + "\"},";
}
result = result.Substring(, result.Length - );
result += "]";

最终 json 如下:

[
{
"ID": "",
"Name": "小李"
},
{
"ID": "",
"Name": "小王"
}
]

使用这种方式是可以的,但有几个缺点:1.代码显得杂乱,易出错。2.需要自己对特殊字符进行转义,如双引号等,否则 json 序列化将失败。下边看看使用 ServiceStack.Text 来序列化 json。

我们需要下载 ServiceStack.Text.dll,将它引用到我们的项目中,并引用 ServiceStack.Text 命名空间。下边先看看单个类对象的序列化:

Staff staff = new Staff() { ID = , Name = "xiaozhao" };
var result = staff.ToJson();

这样得到的 json 如下:

{
"ID": ,
"Name": "xiaozhao",
"Age":
}

细心的朋友会发现,我们在输出中并不打算使用 Age 属性,但这里却输出了 Age,为解决这个问题,我们有下边方法。

1.使用 JsonObject 类,它继承自Dictionary<string, string>,使得我们可以如下来输出我们想要的属性。

Staff staff = new Staff() { ID = , Name = "xiaozhao" };
JsonObject json = new JsonObject();
json.Add("ID", staff.ID.ToString());
json.Add("Name", staff.Name);
var result = json.ToJson();

这样得到下边的结果[结果一],达到了我们的目的。

{
"ID": ,
"Name": "xiaozhao"
}

2.在项目中添加 System.Runtime.Serialization ,并引用命名空间 System.Runtime.Serialization。

我们可以在属性上边指明要序列化的属性,如下:

[DataContract]
public class Staff
{
[DataMember]
public long ID { get; set; }
[DataMember]
public string Name { get; set; }
public int Age { get; set; }
}

或者:

public class Staff
{
public long ID { get; set; }
public string Name { get; set; }
[IgnoreDataMember]
public int Age { get; set; }
}

这样下边的代码输出的结果就变得和[结果一]相同了。

Staff staff = new Staff() { ID = , Name = "xiaozhao" };
var result = staff.ToJson();

这样得到的 json 如下:

{
"ID": ,
"Name": "xiaozhao",
"Age":
}

最后,我们看下类对象集合的序列化,我们添加职员的联系方式如下:

List<Contact> listContact = new List<Contact>();
listContact.Add(new Contact() { StaffID = , Email = "xiaowang@163.com" });
listContact.Add(new Contact() { StaffID = , Email = "xiaoli@163.com" });

每个职员可能对应一个联系方式,这里要考虑有的职员没有联系方式的情况,直接给出代码:

List<string> list = new List<string>();
foreach (var staff in listStaff)
{
JsonObject json = new JsonObject();
json.Add("ID", staff.ID.ToString());
json.Add("Name", staff.Name); //联系方式
var contact = listContact.FirstOrDefault(m => m.StaffID == staff.ID);
if (contact != null)
{
JsonObject jsonContact = new JsonObject();
jsonContact.Add("Email", contact.Email);
//这里注意,将 Contact 对象序列化后的json串添加到了json对象
json.Add("Contact", contact.ToJson());
}
//将json对象序列化再添加到list
list.Add(json.ToJson());
}
//得到最终json串
var result = string.Format("[{0}]", string.Join(",", list));

得到的 json:

[
{
"ID": 2,
"Name": "小李"
},
{
"ID": 3,
"Name": "小王",
"Contact": {
"StaffID": 3,
"Email": "xiaowang@163.com"
}
}
]

而反序列化时,使用 FromJson() 即可:

var staff = result.FromJson<List<Staff>>();
本文简单介绍了下使用
ServiceStack.Text 来序列化 json,希望对没有使用过的朋友有些帮助。

使用 ServiceStack.Text 序列化 json的实现代码的更多相关文章

  1. 使用 ServiceStack.Text 序列化 json的实现代码【转】

    转自:http://www.jb51.net/article/38338.htm 今天发篇文章总结下自己使用 ServiceStack.Text 来序列化 json.它的速度比 Newtonsoft. ...

  2. 使用 ServiceStack.Text 序列化 json 比Json.net更快

    本节将介绍如何使用ServiceStack.Text 来完成高性能序列化和反序列化操作. 在上章构建高性能ASP.NET应用的几点建议 中提到使用高性能类库,有关于JSON序列化的讨论. 在诊断web ...

  3. 使用 ServiceStack.Text 序列化 json

    相信做 .net 开发的朋友经常会遇到 json 序列化这样的需要,今天发篇文章总结下自己使用 ServiceStack.Text 来序列化 json.它的速度比 Newtonsoft.Json 快很 ...

  4. ServiceStack.Text / Newtonsoft.Json 两种json序列化性能比较

    JSON序列化现在应用非常多,尤其在前后端分离的情况下,平常大多数C#下都使用Newtonsoft.Json来操作,量少的情况下,还可以忽略,但量大的情况下就要考虑使用ServiceStack.Tex ...

  5. ServiceStack.Text 更快的序列化

    Json.net 是以前最经常用的序列化组件,后来又注意到ServiceStack号称最快的,所以我做了以下测试 1)Json.net using System; using System.Colle ...

  6. ServiceStack.Text json中序列化日期格式问题的解决

    标记: ServiceStack.Text,json,序列化,日期 在使用ServiceStack.Text的序列化为json格式的时候,当属性为datetime的时候,返回的是一个new date( ...

  7. Replace JSON.NET with ServiceStack.Text in ASP.NET Web API

    Because ServiceStack.Text performs much better I recently stumbled across a comparison of JSON seria ...

  8. python---基础知识回顾(四)(模块sys,os,random,hashlib,re,序列化json和pickle,xml,shutil,configparser,logging,datetime和time,其他)

    前提:dir,__all__,help,__doc__,__file__ dir:可以用来查看模块中的所有特性(函数,类,变量等) >>> import copy >>& ...

  9. JavaScriptSerializer 序列化json 时间格式

    利用JavaScriptSerializer 序列化json 时间格式,得到的DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,显然要进行转换 1.利用字符串直 ...

随机推荐

  1. SQL SERVER表变量和临时表

    一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...

  2. 七、Linq To XML:XElement、XDocument

    一.概述 LINQ to XMLLINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework.NET Framework 编程语言中处理 XM ...

  3. C#格式化信息,格式化数字、格式化日期

    一.格式化方法: 1.ToString()实例方法 使用当前文化: varname.ToString("C4"); 使用特定文化: varname.ToString("C ...

  4. rownum行号

    1.rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀. 如: ...

  5. TG2

    1,什么滑动窗口? 2,这人讲的不行还是我的问题.. 3,搞得我都想睡觉了 4,1904,不停扫,输出最高的高度 一个差分的过程,先加上再减去,但是要维护一个最值 什么动态开点(只能用线段树并且内存很 ...

  6. Hdu 4312-Meeting point-2——哈夫曼距离与切比雪夫距离

    题意 从 $n$ 个点中选择一点,使得其他点到其的切比雪夫距离最小($0 < n \leq 1e5$). 分析 定理:$(x_1, y_1)$ 与 $(x_2, y_2)$ 的曼哈顿距离等于 $ ...

  7. Hive的安装和配置

    前提是:hadoop必须已经启动了***         1°.解压hive的安装包            [crxy@master soft]# tar -zxvf apache-hive-0.14 ...

  8. HTML div块内剧中

    在HTML中有一个块内元素剧中的方法   那就是margin:0 auto; 剧中前 剧中后

  9. 对象(面向对象、创建对象方式、Json)

    一.面向对象 面向过程:凡事亲力亲为,每件事的具体过程都要知道,注重过程 面向对象:根据需求寻找对象,所有的事都用对象来做,注重结果 面向对象特性:封装.继承.多态(抽象性) js是一门基于对象的语言 ...

  10. P2679 子串 DP

    P2679 子串 DP 从字符串A中取出\(k\)段子串,按原顺序拼接,问存在多少个方案使拼接的字符串与字符串B相同 淦,又是这种字符串dp 设状态\(ans[i][j][k]\)表示A串位置\(i\ ...