Jacksonの統合とベストプラクティス

6974 ワード

Jacksonは流行のJSONシーケンス化/逆シーケンス化ツールです.公式ホームページ:https://github.com/FasterXML/jackson、各サブモジュールの紹介などが含まれています.現在更新されているのは2.xシリーズ、安定版は2.8.6、released 12-Jan-2017.
1.アクセス
  • Jacksonシリーズは、jackson-core:jacksonFactoryの定義パッケージの3つのコンポーネントに分けられ、最も基本的なシーケンス化逆シーケンス化機能を提供します.jackson-annotations:jackson注記jackson-databindをサポート:ObjectMapper、jacksonシーケンス化/逆シーケンス化で最も一般的なクラスを提供します.
  • maven依存:
    
      com.fasterxml.jackson.core
      jackson-core
      2.8.6
    
    
      com.fasterxml.jackson.core
      jackson-databind
      2.7.0
    
    
      com.fasterxml.jackson.core
      jackson-annotations
      2.8.6
    
    
  • 2.使用
  • jackson-coreを用いてJSONシーケンス化と逆シーケンス化(理論的に)を完了できるが,使用は煩雑である.参照リンク:https://github.com/FasterXML/jackson-coreインスタンス:http://www.cowtowncoder.com/blog/archives/2009/01/entry_132.html
  • 日常jackson-databindを用いてシーケンス化と逆シーケンス化を完了する.公式リンク:https://github.com/FasterXML/jackson-databind詳細インスタンス:http://blog.csdn.net/java_huashan/article/details/46375857

  • POJOシーケンス化/逆シーケンス化
    ObjectMapper mapper = new ObjectMapper(); // create once, reuse
    //    :
    MyValue value = mapper.readValue(new File("data.json"), MyValue.class);
    // or:
    value = mapper.readValue(new URL("http://some.com/api/entry.json"), MyValue.class);
    // or:
    value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class);
    
    //   :
    mapper.writeValue(new File("result.json"), myResultObject);
    // or:
    byte[] jsonBytes = mapper.writeValueAsBytes(myResultObject);
    // or:
    String jsonString = mapper.writeValueAsString(myResultObject);
    
    //   
    Map scoreByName = mapper.readValue(jsonSource, Map.class);
    List names = mapper.readValue(jsonSource, List.class);
    //     
    Map results = mapper.readValue(jsonSource, new TypeReference>() { } );

    TreeMode
    // map ObjectNode,list ArrayNode,     JsonNode
    // map   :
    // set("string",variable);
    // put("string",string/int);
    // get("string");
    // list   :
    // add("string"/variable);
    
    // mapper.readTree(String) String   ,   JsonNode
    // mapper.writeValueAsString(JsonNode)  JsonNode     
    // mapper.writeTree(JsonGenerator, JsonNode)  JsonNode     。     JsonFactory.createGenerator()  ,   Writer, File, OutputStream 。
    // can be read as generic JsonNode, if it can be Object or Array; or,
    // if known to be Object, as ObjectNode, if array, ArrayNode etc:
    ObjectNode root = mapper.readTree("stuff.json");
    String name = root.get("name").asText();
    int age = root.get("age").asInt();
    
    // can modify as well: this adds child Object as property 'other', set property 'type'
    root.with("other").put("type", "student");
    String json = mapper.writeValueAsString(root);
    
    // with above, we end up with something like as 'json' String:
    // {
    //   "name" : "Bob", "age" : 13,
    //   "other" : {
    //      "type" : "student"
    //   }
    // }

    stream API
         ,    。      。
    

    3.一般的な注釈と構成
  • 常用注記:@JsonIgnoreこの注記は属性に用いられ、JSON操作時にこの属性を無視する役割を果たす.@JsonFormatこの注記は、@JsonFormat(pattern="yyyy-MM-dd HH-mm-ss")のようなDateタイプを直接所望のフォーマットに変換する役割を果たします.JsonPropertyこの注記は、trueNameプロパティをname,@JsonProperty("name")のような別の名前にシーケンス化する役割を果たします.
  • Mapperのいくつかの実用的な構成:(他の構成では、上記jackson-databindの公式リンクが表示されます)
  • // to allow serialization of "empty" POJOs (no properties to serialize)
    // (without this setting, an exception is thrown in those cases)(         )
    mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    // to write java.util.Date, Calendar as number (timestamp):(       )
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    // to allow (non-standard) unquoted field names in JSON:(        ,  FastJson   bug)
    mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    // to allow use of apostrophes (single quotes), non standard(   )
    mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);

    4.ベストプラクティス
  • JacksonFactoryとObjectMapperはいずれもスレッドが安全なので、できるだけ多重化します.(詳細:ObjectMapperはreConfigureされたときに非スレッドセキュリティです.理論上の絶対セキュリティのために、可変のObjectReader/ObjectWriterを使用してください.
  • オブジェクトを使用した後、クリーンアップして閉じます.JsonParserやJsonGeneratorなどです.
  • JacksonはJavaBeanに基づいて属性をシリアル化し、属性にGETTERメソッドがない場合、デフォルトでは出力されません.

  • 5.FastJsonと
    JacksonとFastJsonのスピード争いが続いている.多くの証拠は,多数のオブジェクトがシーケンス化,逆シーケンス化を行う場合,FastJsonの速度はやや優れているが,Jacksonとの差は大きくないことを示している.しかし、FastJsonではいくつかの大きなバグが発生し、ビジネス障害を引き起こしたことがあります.例:
    印刷不可文字の異常:1.1.41で修正.http://i.dotidea.cn/2014/08/fastjson-serialize-overflow/リモート・コードは、1.2.28で修復された高危険なセキュリティ・ホールを実行します.https://github.com/alibaba/fastjson/wiki/security_update_20170315
    Jacksonのコード品質は比較的高いと感じます.日常業務で多数のオブジェクトのシーケンス化ニーズがない場合は、Jacksonを推奨します.