fastjsonによる自省機能の最適化

2074 ワード

JSON標準は自省をサポートしていません.つまり、次のようなJSONテキストは、どのようなタイプなのか分かりません.
{"id":12,"name":"   "}

fastjsonは、次のような入力タイプ情報をサポートします.
String text = ...; // {"id":12,"name":"   "}
JSON.parseObject(text, Employee.class);

シーケンス化の場合、WriteClassNameのプロパティを使用すると、JSONテキストは次のようになります.
Employee x = ...;
String text = JSON.toJSONString(x, SerializerFeature.WriteClassName);

上の例のJSONテキストは次のとおりです.
{“@type”:"com.alibaba.demo.Employee", "id":12,"name":"   "}

@typeプロパティのあるテキストは自動的にタイプが認識され、上のテキストはこのように処理できます.
Employee x = (Employee) JSON.parse(text);

これがFastjsonがサポートする自省機能です.
しかしWriteClassNameを使うと、jsonテキストのサイズがずいぶん増えましたが、これはどうすればいいのでしょうか.fastjson 1.1.6バージョンでは最適化処理が行われ、必要ではなくタイプ情報は出力されません.
class A {
B getB();
setB(B b);
}

クラスAは属性Bを持ち,AとBはともにオブジェクトであるが,逆シーケンス化の場合,Propertyのタイプ情報からBのタイプを得ることができ,この場合はAのタイプを出力するだけで,Bのタイプ情報を出力する必要はない.
例:
{"@type":"com.alibaba.json.demo.A","b":{"id":0}}

1.1.5より前のバージョンは次のようになります.
{"@type":"com.alibaba.json.demo.A","b":{"@type":"com.alibaba.json.demo.B","id":0}}

これにより、Listタイプの属性を用いることができ、冗長で不要なタイプ情報を低減することができる.
以下に、いくつかのテスト例を示します.
http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/test/java/com/alibaba/json/test/bvt/writeClassName/WriteClassNameTest2.java
http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/test/java/com/alibaba/json/test/bvt/writeClassName/WriteClassNameTest_List2.java