`
kamhung
  • 浏览: 1967 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

开源一个扩展性强的Json库(jsonconvert0.1.0beta版)

阅读更多

 

  由于工作上有json格式的数据需要处理, 需要一个json库, 但是网上的json库不是性能不好就是功能有限。 不得已逼自己动手写一个。 由于时间有限, 目前这个库只是用最基础的反射实现。 我打算分三个阶段完善这个jsonconvert库。 

1、 json的框架与扩展性设计

2、 反序列化与序列化功能的优化

3、 性能优化,去掉反射改用asm

  虽然目前是用反射实现的, 但是其性能已经不比其他json库差多少。 初期大部分时间花在框架与反序列化的设计上面。  实现细节方面没有下太多功夫。 现在将jsonconvert开源出来, 希望集思广益, 从网友那吸收更多的金点子~  : )

   先让大家看看jsonconvert的性能是个什么程度, 如果性能不好, 相信大家也不会再往下看了。 最近看到iteye上面有个fastjson库, 性能算是目前最快的, 下面是与fastjson简单的性能比较结果: (测试代码见附件)

--------------------------NodeRecord-----------------------------------

jsonconvert 循环解析单例10000次耗时: 786

  fastjson  循环解析单例10000次耗时: 1466

jsonconvert 循环解析数组10000次耗时: 13403

  fastjson  循环解析数组10000次耗时: 27020

-----------------------------------------------------------------------

jsonconvert 循环序列单例10000次耗时: 867

  fastjson  循环序列单例10000次耗时: 809

jsonconvert 循环序列数组10000次耗时: 16270

  fastjson  循环序列数组10000次耗时: 13830

--------------------------SimpleRecord-----------------------------------

jsonconvert 循环解析单例10000次耗时: 349

  fastjson  循环解析单例10000次耗时: 433

jsonconvert 循环解析数组10000次耗时: 3234

  fastjson  循环解析数组10000次耗时: 6454

-------------------------------------------------------------------------

jsonconvert 循环序列单例10000次耗时: 240

  fastjson  循环序列单例10000次耗时: 327

jsonconvert 循环序列数组10000次耗时: 3769

  fastjson  循环序列数组10000次耗时: 3051

可以看出jsonconvert虽然是反射做的, 其性能已经不比fastjson差了。 而且如果测试的JavaBean内嵌层越多, 与fastjson的差距就会越大。  本来想用JDK7里面的InvokeDynamic替换反射, 但是考虑兼容JDK56, 且以后始终会用asm代替, 所以没有使用, 简单的测试过InvokeDynamic,性能只是比反射快1-2倍而已,与直接调用的差距还是有一段滴。

下面介绍一下jsonconvert的功能。 普通对象只需要使用一个类JsonConvert, 该类只有三个方法:

 

 

	public static String convertTo(Object value);
	public static <T> T convertFrom(String text, Class<T> clazz);
	public static <T> T[] convertArrayFrom(String text, Class<T> clazz);

 简单介绍下jsonconvert的功能,目前默认支持的类型:

 

boolean -- double

Boolean[]-- double[]

String

Enum

Collection 

Map

树形循环引用(有空会重点介绍)

jsonconvert最大的特点是扩展性强。 含扩展类(有时间再写个详细的文档)

JsonListener :    单个字段类(根据一个字符串值就可以转换成的对象)

JsonObjectToken:  大对象类("{" 开头的对象)

JsonObjectPrinter  序列化类

    由于时间有限, 下面只简单介绍下JsonListener :

Jsonconvert里面所有基础数据类型都是根据JsonListener 转换的。 大家可以看到很多java库里面都会把booleanintboolean[]int[]String 这些类进行特殊处理。 而jsonconvert里面秉着纯面向对象思想, 不会给booleanint这些"异类"数据类型给予国企优待。与其他类型一视同仁。 库默认只实现了8个基本数值类型与String、枚举类。 很多其他常用类(如 Date, BigInteger, AtomicLong)并没有内置(后期可能会加上)。如果你当前有JavaBean的字段用到了Date类型, 你可以手工给jsonconvert注册DateJsonListener:

 

	import com.tencent.tendon.convert.json.*;
public class DateJsonListener implements JsonListener<Date> {
	
	    @Override
	    public String convertTo(Date value) {
	        return value == null ? null : String.valueOf(value.getTime());
	    }
	
	    @Override
	    public Date convertFrom(String value) {
	        return value == null ? null : new Date(Long.parseLong(value));
	    }
	
	    @Override
	    public boolean quotable() {
	        return true;
	    }
	}
	JsonFactory.register(java.util.Date.class, new DateJsonListener());

 同时你可以更改框架里面的默认实现。 比如框架的里面的byte[] 字段的序列化得到的是[1,2,3] 这种类int[]字符串。 如果你想将byte[]转换成base64字符串输出可以给JsonFactory注册自己的byte[]对象的JsonListener: 

 

 

	JsonFactory.register(byte[].class, new JsonListener<byte[]>() {
	
	            @Override
	            public String convertTo(byte[] value) {
	                if (value == null) return null;
	                return JsonWriter.hexTo(value);
	            }
	
	            @Override
	            public byte[] convertFrom(String value) {
	                if (value == null) return null;
	                return JsonWriter.hexFrom(value);
	            }
	
	            @Override
	            public boolean quotable() {
	                return true;
	            }
	        });
 

 

 

 

jsonconvert库下载地址: 

http://tendon.googlecode.com/svn/trunk/tendon.jsonconvert/tags/0.1.0-beta/ 

(待续)....

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    c# Json库 (.NET2.0)

    5. **LINQ to JSON**:Json.NET的另一个强大特性是支持LINQ查询,允许你像操作XML一样操作JSON数据。例如,查找年龄大于30的人: ```csharp JArray people = JArray.Parse("[{\"Name\":\"张三\",\"Age\":30}, {\...

    c#利用Newtonsoft.Json解析json(带数组)

    在.NET开发环境中,C#语言提供了多种方式来处理JSON数据,其中Newtonsoft.Json库是最常用的一个。本教程将深入探讨如何使用Newtonsoft.Json库在C#中解析包含数组的JSON对象,这对于处理从Web API、数据库或其他服务...

    C#解析Json开源库-Newtonsoft.Json.zip

    为了方便C#开发者处理JSON数据,一个强大的开源库——Newtonsoft.Json应运而生。这个库由James Newton-King 创建并维护,它为C#提供了高效、灵活且功能丰富的JSON序列化和反序列化工具。 标题"\"C#解析Json开源库-...

    C#解析json的Newtonsoft.Json.dll各种.net版本

    这个库由James Newton-King 开发,它为C#开发者提供了丰富的功能,便于序列化和反序列化JSON,使得JSON数据在.NET应用中的使用变得极其简单。 Newtonsoft.Json.dll库支持多种.NET框架版本,包括.NET Framework 2.0...

    c# .net 类型“JsonConvert”同时存在于“Newtonsoft.Json, Version=6.0.0.0

    类型“JsonConvert”同时存在于“Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”和“Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6...

    Newtonsoft.Json .net framework4.0版

    在.NET开发中,序列化和反序列化JSON数据是一项常见的任务,而Newtonsoft.Json库是.NET生态系统中最流行和广泛使用的JSON处理库之一。该库由James Newton-King 开发,提供了一套全面且性能高效的API,用于在.NET对象...

    JsonConvert.zip 2.0

    JsonConvert可能是这样的一个库,它提供了方便的方法将.NET对象转换为JSON字符串,以及将JSON文本解析成.NET对象。 1. **JSON序列化**:序列化是将.NET对象转换为JSON字符串的过程。JsonConvert库可能包含如`ToJson...

    JsonConvert.zip

    综上所述,`JsonConvert.zip`提供的资源是一个关于C#使用Newtonsoft.Json进行JSON操作的示例。通过`JsonConvert`类,我们可以方便地进行JSON序列化和反序列化,这对于开发Web应用程序、API接口或者任何需要JSON数据...

    json动态链接库

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。...通过这个库,开发者无需关心底层实现,只需调用相应的API,就可以轻松地在C#应用中处理JSON数据。

    Json字符串转换Hashtable,DataTable,DataSet方法和反转换方法

    同样需要借助Newtonsoft.Json库,我们可以创建一个DataTable实例,然后使用`JsonConvert.DeserializeObject`方法,但需要自定义一个转换器: ```csharp using Newtonsoft.Json; using System.Data; string json = ...

    Json动态链接库

    "Newtonsoft.Json.Compact.dll"是.NET框架下的Json.NET库的一个紧凑版本,由James Newton-King开发。Json.NET是.NET社区中最受欢迎的JSON库之一,它提供了丰富的功能,包括序列化和反序列化对象到JSON,JSON到对象的...

    C# Newtonsoft.JSON库文件和源码

    例如,你可以使用`JsonConvert.SerializeObject()`方法将一个C#对象转换成JSON格式的字符串,或者使用`JsonConvert.DeserializeObject()`方法将JSON文本恢复为相应的C#对象实例。 2. **动态JSON操作**:Newtonsoft....

    各个版本Newtonsoft.Json

    Newtonsoft.Json,通常被称为Json.NET,是由James Newton-King 开发的一个流行的开源JSON库,用于.NET框架。这个库广泛应用于.NET开发中,因为其高效、功能丰富和易于使用的API。在给定的压缩包文件中,包含了从1.3...

    Excel文件转json库 Newtonsoft.Json.dll

    `Newtonsoft.Json.dll`是.NET平台上非常流行的一个开源库,由James Newton-King开发,主要用于处理JSON数据。这个库提供了丰富的功能,包括序列化和反序列化JSON,以及对JSON数据的各种操作。它支持.NET Framework、...

    Newtonsoft.Json库Demo

    这将创建一个`Person`对象,其`Name`属性为"John",`Age`属性为30。 **二、自定义序列化行为** 1. **数据注解**: Newtonsoft.Json 提供了多种数据注解,允许我们控制序列化和反序列化的具体行为。例如,`...

    Newtonsoft.Json.dll 4.5.0.0 版本

    Newtonsoft.Json.dll 4.5.0.0版本是该库的一个特定迭代,它支持.NET Framework 2.0、3.5以及4.0等多个框架版本。这意味着无论你的项目基于哪个.NET框架,都可以利用此版本的库来处理JSON数据。这种跨版本的兼容性...

    Newtonsoft.json.dll v12.0.3

    Newtonsoft.Json.dll是由James Newton-King 开发的一个开源项目,也被称为Json.NET。它支持.NET Framework、.NET Core、.NET Standard等多个.NET平台,为开发者提供了全面的JSON处理解决方案。v12.0.3是该库的一个...

    dotnet-NewtonsoftJson是一款NET平台中开源的JSON序列化和反序列化类库

    例如,你可以使用`JsonConvert.SerializeObject()`方法将一个C#对象转换成JSON格式的文本。 2. **反序列化**:将JSON字符串转换回.NET对象。这在接收服务器响应或者从文件中加载数据时很有用。`JsonConvert....

    Json.net 全版本新版dll,绝对可用

    JSON.NET 是一个非常流行的 JSON 库,主要用于 .NET 开发,尤其在 C# 中广泛使用。这个压缩包包含了 JSON.NET 的多个版本,适用于不同的 .NET Framework 版本,确保无论你的项目基于哪个框架,都能找到兼容的 DLL ...

Global site tag (gtag.js) - Google Analytics