相信做 .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. Spring MVC 学习笔记(一)

    • 1.SpringMVC概述 • 2.SpringMVC的HelloWorld • 3.使用@RequestMapping映射请求 • 4.映射请求参数&请求头 • 5.处理模型数据 • 6 ...

  2. sping boot 笔记 哎呦不错哦

    http://blog.csdn.net/u011998835/article/details/78352829 学习

  3. firewall 相关命令

    1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disabl ...

  4. REST与RPC区别

    OSI网络七层模型 第一层:应用层.定义了用于在网络中进行通信和传输数据的接口: 第二层:表示层.定义不同的系统中数据的传输格式,编码和解码规范等: 第三层:会话层.管理用户的会话,控制用户间逻辑连接 ...

  5. LOJ P10114 数星星 stars 题解

    每日一题 day7 打卡 Analysis 树状数组 由于题目中给的数据是按y轴排序,我们只需构建x轴的树状数组,也就是说我们只需统计星星i之前一共有多少个x坐标小于或等于Xi的星星,这个数值也就是星 ...

  6. selenium + chromeDriver的ip代理设置

    from selenium import webdriver from selenium.webdriver.chrome.options import Options import zipfile ...

  7. Luogu4689 [Ynoi2016]这是我自己的发明 【莫队】

    题目链接:洛谷 又来做Ynoi里面的水题了... 首先换根的话是一个套路,首先以1为根dfs,然后画一画就知道以rt为根,x的子树是什么了.可以拆分为2个dfs连续段. 然后如果要计算\([l_1,r ...

  8. (7)打造简单OS-加载内核

    一.简要说明 我们在第五讲[(5)打造简单OS-进入保护模式]中的mbr.S 汇编文件有段这样的代码 mov eax, 0x2 ; 起始扇区lba地址,从间隔第二个扇区开始 mov bx, 0x900 ...

  9. 将List<E>内对象按照某个字段排序

    主要用到java.util的Collections类 Collections.sort(list); 其中,E必须实现Comparable<E>接口

  10. 【00NOIP提高组】单词接龙

    #include<bits/stdc++.h> using namespace std; ; int n,length; int vis[N]; string str[N]; inline ...