转自:http://www.jb51.net/article/38338.htm

今天发篇文章总结下自己使用 ServiceStack.Text 来序列化 json。它的速度比 Newtonsoft.Json 快很多,在测试时发现比 fastJson 还快些。

相信做 .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 = 2, Name = "小李" });
listStaff.Add(new Staff() { ID = 3, Name = "小王" });

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

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

最终 json 如下:

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

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

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

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

这样得到的 json 如下:

代码如下:

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

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

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

代码如下:
Staff staff = new Staff() { ID = 1, Name = "xiaozhao" };

JsonObject json = new JsonObject();
json.Add("ID", staff.ID.ToString());
json.Add("Name", staff.Name);

var result = json.ToJson();

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

代码如下:
{
    "ID": 1,
    "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 = 1, Name = "xiaozhao" };
var result = staff.ToJson();

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

代码如下:

List<Contact> listContact = new List<Contact>();
listContact.Add(new Contact() { StaffID = 3, Email = "xiaowang@163.com" });
listContact.Add(new Contact() { StaffID = 4, 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的实现代码

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

  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. java 转换流

    OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节.它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集. imp ...

  2. Spring中Bean的生命周期方法

    Bean的生命周期方法 src\dayday\Car.java package dayday;import com.sun.org.apache.xpath.internal.SourceTree;i ...

  3. iOS学习之SKTagView的使用

    SKTagView是一款支持自动布局的标签tag. 特性: -流式展示标签 -可以配置标签的颜色.事件.间隔.外边距等 -支持Auto layout -可以在UITableViewCell中良好展示 ...

  4. Flask + WSGI + Nginx 云部署

    这几天学着用flask写一些rest api,然后部署到云上.这个过程虽然网上有很多的教程,但还是遇到不少的问题! 采用flask的原因是因为它比较容易上手吧.用flask有专门restful api ...

  5. window.onload() 和 $(function(){})

    再使用 $(function(){})的时候,发现一直取不到元素.但是换成window.onload()则可以取到. 大概推测是页面加载问题,于是把js从header移到了footer,发现 $(fu ...

  6. 写简单游戏,学编程语言-python篇:大鱼吃小鱼

    很常见的游戏之一,实现原理并不复杂,并且参考了几个相关的代码.这边主要还是以学习编程语言和学习编程思路为重点记录一下吧.最近时间有点吃紧,只能匆忙记录一下.用pygame做的大鱼吃小鱼的游戏截图如下: ...

  7. SQLAutoCode - error when attempting to generate schema

    I'm trying to auto generate a schema for use in SQLalchemy, I'm using sqlautocode to do this, I use ...

  8. 使用注解配置Spring框架自动代理通知

    话不多说上代码 项目架构图及Lib包如下: 第二步创建业务类接口 package cn.happy.day01.entity; /** * 1.业务接口 * @author Happy * */ pu ...

  9. 号外:MS被开源软件打败了!

    [编辑推荐]微软宣布.NET将开源 支持Mac OS X和Linux (149/16525) » [最多推荐]Visual Studio Contact(); 直播笔记(44/2744) » [最多评 ...

  10. T卡热插拔

    1.配置: GPIO 管脚 GPIO方向 Debounce polarity Sensitive_level Host1 CDpin (EINT16) 16 INPUT PULL UP Enable ...