jsonプロトコル実装
4581 ワード
ネットワークでデータを転送するには、データフォーマットを定義し、さまざまなプロトコルのパフォーマンスを比較する必要があります.
シーケンス化時間逆シーケンス化時間サイズ圧縮後サイズ
JAvaシーケンス化
8654
43787
889
541
hessian
6725
10460
501
313
protobuf
2964
1745
239
149
thrift
3177
1949
349
197
avro
3520
1948
221
133
json-lib
45788
149741
485
263
jackson
3052
4161
503
271
fastjson
2595
1472
468
251
テストデータ:https://github.com/eishay/jvm-serializers/wiki/TestValue
これは468 bytesのJSON Bytesテストで、テスト結果から見ると、シーケンス化と逆シーケンス化にかかわらず、jsonの性能はボトルネックではありません.今日はjacksonの実現に重点を置いた.
jacksonによるjsonの実装は主に2つの部分parserとdeserializeに分けられ,それぞれJsonParserとJsonDeserializerによって実現される.
1.JsonParser
Reader BasedParserはJsonParserの最終的な実装であり、継承関係は以下の通りである.
JsonParserは、基本的な読み出しAPIを定義する.
2. JsonDeserializer
JsonDeserializerはstring------>様々なjavaタイプのシーケンス化実装であり、jacksonはavaタイプに応じて異なるDeserializerを定義している.例えば、U n t e p e dObjectDeserializer、CollectionDeserializer、ObjectArrayDeserializer、StringCollectionDeserializer、PrimitiveOrWrapperDeserializer
3.jacksonのちょっとしたテクニック
一重引用符を許可:
nulオブジェクトを空の文字に変換するには、次の手順に従います.
シーケンス化時間逆シーケンス化時間サイズ圧縮後サイズ
JAvaシーケンス化
8654
43787
889
541
hessian
6725
10460
501
313
protobuf
2964
1745
239
149
thrift
3177
1949
349
197
avro
3520
1948
221
133
json-lib
45788
149741
485
263
jackson
3052
4161
503
271
fastjson
2595
1472
468
251
テストデータ:https://github.com/eishay/jvm-serializers/wiki/TestValue
これは468 bytesのJSON Bytesテストで、テスト結果から見ると、シーケンス化と逆シーケンス化にかかわらず、jsonの性能はボトルネックではありません.今日はjacksonの実現に重点を置いた.
jacksonによるjsonの実装は主に2つの部分parserとdeserializeに分けられ,それぞれJsonParserとJsonDeserializerによって実現される.
1.JsonParser
Reader BasedParserはJsonParserの最終的な実装であり、継承関係は以下の通りである.
public abstract class JsonParser {
}
public abstract class JsonParserMinimalBase extends JsonParser{
}
public abstract class JsonParserBase extends JsonParserMinimalBase{
}
public final class ReaderBasedParser extends JsonParserBase{
}
JsonParserは、基本的な読み出しAPIを定義する.
JsonFactory
でJsonParserを作成することができますが、parserは文法分析を行い、実際には入力したjson文字列をchar[]に変換し、1文字の読み取りごとにJsonTokenはenumであり、jsonで役立つtoken typeを定義しています.public enum JsonToken{
START_OBJECT("{"),
/**
* START_OBJECT is returned when encountering '}'
* which signals ending of an Object value
*/
END_OBJECT("}"),
/**
* START_OBJECT is returned when encountering '['
* which signals starting of an Array value
*/
START_ARRAY("["),
/**
* START_OBJECT is returned when encountering ']'
* which signals ending of an Array value
*/
END_ARRAY("]"),
}
2. JsonDeserializer
JsonDeserializerはstring------>様々なjavaタイプのシーケンス化実装であり、jacksonはavaタイプに応じて異なるDeserializerを定義している.例えば、U n t e p e dObjectDeserializer、CollectionDeserializer、ObjectArrayDeserializer、StringCollectionDeserializer、PrimitiveOrWrapperDeserializer
3.jacksonのちょっとしたテクニック
一重引用符を許可:
String json = "{'photoId': '1012309', 'id': '1001'}";
JsonFactory factory = new JsonFactory();
ObjectMapper objectMapper = new ObjectMapper(factory);
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
JsonParser jsonParser = factory.createJsonParser(json);
nulオブジェクトを空の文字に変換するには、次の手順に従います.
package com.duitang.dboss.resolve.json;
import java.io.IOException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
public class NullStringSerializer extends JsonSerializer<Object> {
public final static NullStringSerializer instance = new NullStringSerializer();
private NullStringSerializer(){
super();
}
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
JsonProcessingException {
jgen.writeString("");
}
}
StdSerializerProvider sp = new StdSerializerProvider();
sp.setNullValueSerializer(NullStringSerializer.instance);
objectMapper = new ObjectMapper(jsonFactory);
objectMapper.setSerializerProvider(sp);