オープンソースの拡張性の高いJsonライブラリ(jsonconvert 0.1.0 beta版)

4737 ワード


仕事上json形式のデータがあるので処理する必要があり、jsonライブラリが必要ですが、ネット上のjsonライブラリは性能が悪いのではなく機能が限られています.やむを得ず自分で1つ書くように強要した.時間が限られているため,現在,このライブラリは最も基礎的な反射で実現されているだけである.このjsonconvertライブラリを3段階に分けて改善するつもりです. 
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との差が大きくなる.反射をJDK 7の中のInvokeDynamicで置き換えたいと思っていたのですが、JDK 5、6の互換性を考えて以降は常にasmで代用しているので使用せず、簡単にInvokeDynamicをテストしたことがありますが、性能は反射より1-2倍速いだけで、ダイレクトコールとの差はまだあります.
jsonconvertの機能について説明します.通常のオブジェクトでは、3つの方法しかないクラス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ライブラリでは、boolean、int、boolean[]、int[]、Stringなどのクラスを特殊に処理していることがわかります.jsonconvertでは、boolean、intなどの「異種」データ型に国有企業を優遇しない純粋な対象思想を持っている.他のタイプと平等に見る.ライブラリのデフォルトでは、String、列挙クラスと8つの基本数値タイプしか実装されていません.他の多くの一般的なクラス(Date,BigInteger,AtomicLongなど)は内蔵されていません(後期に追加される可能性があります).JavaBeanのフィールドでDateタイプを使用している場合は、jsonconvertにDateのJsonListenerを手動で登録できます.
 
	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[]をbase 64文字列出力に変換したい場合は、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/ 
(続きを待つ)....