相信做 .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. vscode安装依赖报错 TypeError: zipfile.readEntry is not a function

    错误原因是npm的版本太高,需要把5.x的版本换回4.x的 npm install npm@4 -g 或者 cnpm install npm@4 -g 详见:https://github.com/Mi ...

  2. ubuntu下新立得(synaptic)软件包管理器安装

    1.从ubuntu下的软件中心(面板主页中输入soft即可找到)搜索安装synaptic后,打开新立得一闪就自动关了.解决办法为: 1.1命令行下卸载,命令行下重新安装: 卸载: #purge表示卸载 ...

  3. 20191029 牛客CSP-S提高组赛前集训营1

    前一个小时看这几道题感觉要爆零 A. 仓鼠的石子游戏 分析一下发现a[i]>1a[i]>1a[i]>1时后先手必输,a[i]=1a[i]=1a[i]=1时先手必赢 然后直接看1的个数 ...

  4. 使用集合方式注入IoC

    使用集合方式注入Ioc 1.创建类 //集合 private String[] arrays; //list集合 private List<Integer> lists; //map集合 ...

  5. [笔记] 三元环 && 四元环计数

    Thanks to i207M && iki9! 三元环计数 无向图的三元环计数 我们首先需要对无向边按一定规则定向: 设 \(in[u]\) 表示 \(u\) 的度数 若 \(in[ ...

  6. 二十一.构建memcached服务、LNMP+memcached、PHP的本地Session信息、PHP实现session共享

    proxy client web1 web2   1.构建memcached服务 ]# yum -y install memcached ]# cat /etc/sysconfig/memcached ...

  7. gdisk分区命令

    GPT fdisk(由gdisk.cgdisk.sgdisk和fixparts程序组成)是一组用于Linux.FreeBSD.Mac OS X和Windows的文本模式分区工具.gdisk.cgdis ...

  8. 【优化算法】变邻域搜索算法(VNS)求解TSP(附C++详细代码及注释)

    00 前言 上次变邻域搜索的推文发出来以后,看过的小伙伴纷纷叫好.小编大受鼓舞,连夜赶工,总算是完成了手头上的一份关于变邻域搜索算法解TSP问题的代码.今天,就在此给大家双手奉上啦,希望大家能ENJO ...

  9. CF516D Drazil and Morning Exercise【并查集,结论】

    题目描述:一棵\(n\)个点的树,设\(d(u)=\max_{v\in V}\text{dis}(u,v)\),每次询问一个数\(l\),求一个最大的联通子图\(L\),使得\(\forall u,v ...

  10. springBoot学习(二):初学JPA

    依旧跟着大佬学习JPA,在这里记下过程. JPA主要做的事情是简化数据库操作,至少现在为止,我觉得还是挺方便简单明了的.在原本代码的基础下,更改UserController.User.UserRepo ...