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の最終的な実装であり、継承関係は以下の通りである.
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);