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依存: 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シーケンス化/逆シーケンス化
TreeMode
stream API
3.一般的な注釈と構成常用注記:@JsonIgnoreこの注記は属性に用いられ、JSON操作時にこの属性を無視する役割を果たす.@JsonFormatこの注記は、@JsonFormat(pattern="yyyy-MM-dd HH-mm-ss")のようなDateタイプを直接所望のフォーマットに変換する役割を果たします.JsonPropertyこの注記は、trueNameプロパティをname,@JsonProperty("name")のような別の名前にシーケンス化する役割を果たします. Mapperのいくつかの実用的な構成:(他の構成では、上記jackson-databindの公式リンクが表示されます)
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を推奨します.
1.アクセス
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
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.一般的な注釈と構成
// 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.ベストプラクティス
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を推奨します.