転送:https://www.ibm.com/developerworks/cn/java/jackson-advanced-application/index.html
(日付形式を含む)の書式
日付タイプの異なる種類の、ジャクソンのアプローチが異なっています。
- タイプjava.util.Calendarの、java.util.GregorianCalendar、java.sql.Date、java.util.Date、をjava.sql.Timestampの日のために、指定された形式の場合、ファイルのJSONでlong型配列へデータ。明らかに、このデフォルトの形式、貧しい可読性、フォーマット変換が必要です。ジャクソン日付形式を変換する多くの方法があります。
- メモは、のJsonFormat @「注釈・ジャクソンの使用」の例を参照してください。
- ObjectMapper実施形態では、方法は、指定された形式の文字列データ型としてシリアライズ、ObjectMapper setDateFormat呼び出します。
- 対応するjarファイルのパッケージの依存関係を追加しながら型java.time.LocalDateの日のために、また、あなたは、コードmapper.registerModule(新しいJavaTimeModule())を追加する必要があります
1. JSR31 0構成情報をリスト
<依存> <groupIdを> com.fasterxml.jackson.datatype </ groupIdを> <たartifactId>ジャクソン・データ型-jsr310 </たartifactId> <バージョン> 2.9。1 </バージョン> </依存関係>
ジャクソン2.5以下の場合は、あなたがコードobjectMapper.registerModuleを追加する必要があります(新しいJSR310Module())
- 対応のjarパッケージの依存関係を追加しながら型org.joda.time.DateTimeの日のために、また、あなたは、コードmapper.registerModule(新しいJodaModule())を追加する必要があります
リスト2.ジョダ構成情報
<依存> <groupIdを> com.fasterxml.jackson.datatype </ groupIdを> <たartifactId>ジャクソン・データ型-ジョダ</たartifactId> <バージョン> 2.9。1 </バージョン> </依存関係>
一般的な非直列化されました
また、デシリアライズ・ジャクソンのジェネリックは、優れたサポートを提供しています。
- リストについては、型のメソッドは、TypeReferenceシリアライズを構成することができるconstructCollectionTypeをシリアル化するために呼び出すことができます。
3.一覧ジェネリック例をリスト
CollectionTypeはJavaTypeが= mapper.getTypeFactory() .constructCollectionType(一覧。クラスは、Person。クラス); 一覧 <人> personList = mapper.readValue(jsonInString、JavaTypeが)。 リストの<person> personList = mapper.readValue(jsonInString、新しい TypeReference <リストの<人>>(){});
4.地図のジェネリック例をリスト
// 2番目のパラメータは、マップのキータイプは、マップ値の第3のパラメータタイプである のMapTypeのJavaType = mapper.getTypeFactory()constructMapType(HashMapの.. クラス、文字列クラス、 。人クラス); マップの<string、人> personMap = mapper.readValue(jsonInString、 のJavaType); 地図 <文字列、人> personMap = mapper.readValue(jsonInString、新しい新しい typereference <地図<文字列、人>>(){});
プロパティの可視化
すべてのJavaオブジェクトをシリアル化され、デシリアライズされる属性、つまり、すべての属性は次のようにデフォルトのルールの視覚特性があり、視覚的にありません。
- プロパティ修飾子が公開されている場合は、プロパティがシリアライズおよびデシリアライズさせることができます。
- プロパティ修飾子がパブリックではなく、そのgetterおよびsetterメソッドが公開されている場合、プロパティがシリアライズおよびデシリアライズさせることができます。ゲッター直列化のための方法、およびデシリアライズのためのセッターメソッドので。
- 無パブリックgetterメソッドを持つ唯一のパブリックプロパティのセッターメソッド、場合、プロパティは、逆シリアル化のために使用することができます。
デフォルト属性の可視化のルールを変更するには、メソッドsetVisibilityをObjectMapper呼び出す必要があります。
次の例では、属性名の修飾子がシリアライズとデシリアライズを保護することができることができます。
5.プロパティの例の可視化リスト
mapper.setVisibility(PropertyAccessor.FIELD、Visibility.ANY); パブリック クラス人{ 公共 のint 年齢、 保護された文字列名; } PropertyAccessorをは、タイプが全てFIELD、ゲッター、IS_GETTER、NONE、セッターCREATORをサポート 可視性がサポートされています NY、DEFAULT、NON_PRIVATE、NONE、 PROTECTED_AND_PUBLIC、PUBLIC_ONLY
属性フィルタ
JavaオブジェクトをJSONにシリアライズされた場合、除外するプロパティのいくつかは、JSONに表示されない、ジャクソンは、実装の様々なています。
- 次のように注釈モードは、単一の属性を濾過又は@JsonIgnorePropertiesと@JsonIgnore複数の属性をフィルタリングすることができる、一例です。
プロパティをフィルタの6例をリスト
@JsonIgnore 公共 INT getAge() @JsonIgnoreProperties(値 = { " 年齢"、" Birth_Dateの" }) パブリック クラス人
- addMixIn方法は、道の@JsonIgnorePropertiesを注釈付き。
addMixInメソッドシグネチャを次のように
公共ObjectMapper addMixIn(クラスターゲット、クラスmixinSource <?> <?>);
作用の方法はaddMixIn mixinSource注釈インターフェースまたはクラスが標的またはサブターゲット・タイプ注釈を上書きです。ixInで設定します
@JsonIgnorePropertiesの人peixIn(「名前」)は、以下のように、最終的な属性は、名前、JSONが最終的に生成される無視して、リライトされます。
{ "たbirthDate": "2017年9月13日"、 "年齢":40}
- SimpleBeanPropertyFilterの方法。このアプローチは、最初の2つの方法よりも柔軟性だけでなく、より複雑です。
@JsonFilterのJavaオブジェクトに作用する、クラスまたはインタフェース、第二セットaddMixInを設定する@JsonFilter最初必要性、最後に関連するプロパティをフィルタリングするSimpleBeanPropertyFilter serializeAllExceptメソッドまたはメソッドオーバーライドserializeAsField S impleBeanPropertyFilterを呼び出します。例としては、次のとおりです:
7.例三つの濾過特性をリスト
// 設定されたフィルタクラスまたはインタフェース @JsonFilter(" myFilterを" ) パブリック インターフェースmyFilterを{} // 設定addMixIn mapper.addMixIn(人。クラス、myFilterを。クラス); // serializeAllExcept SimpleBeanPropertyFilterメソッドの呼び出し SimpleBeanPropertyFilter newFilter = SimpleBeanPropertyFilter.serializeAllExcept(" 年齢" ); // またはオーバーライドserializeAsField SimpleBeanPropertyFilter方法 = SimpleBeanPropertyFilter newFilter 新しい新しいSimpleBeanPropertyFilter(){ @Override 公共 ボイドserializeAsField(オブジェクトのPOJO、JsonGeneratorのjgen、 SerializerProviderプロバイダ、のPropertyWriterライターは) 例外を{スロー 場合(writer.getName()等号(!。" 年齢" {)) writer.serializeAsField(POJO、jgen、プロバイダ); } } }。 // 设置FilterProvider FilterProvider filterProvider = 新しいSimpleFilterProvider() .addFilter(" myFilterを" 、newFilter)。 mapper.setFilterProvider(filterProvider).writeValueAsString(人)。
カスタムシリアライズとデシリアライズ
ジャクソンのデフォルトの直列化とクラスのデシリアライズは、実際のニーズを満たすことができないときは、新しい直列化とクラスのデシリアライズをカスタマイズすることができます。
- カスタムシリアライゼーションクラス。JsonGeneratorを使用する必要がメソッドシリアライズ書き換え、JSONを生成しながら、クラス定義された配列から、直接的または間接的な継承StdSerializer又はJsonSerializerを必要とする次のように、一例です。
リスト8
パブリック クラス CustomSerializerはStdSerializerが<人>延び{ @Override 公共 ボイドシリアライズ(人物の人物、JsonGeneratorのjgen、 SerializerProviderプロバイダ)にIOException {スロー jgen.writeStartObjectを(); jgen.writeNumberField(" 年齢" 、person.getAge()); jgen.writeStringField(" 名前" 、person.getName()); jgen.writeEndObject(); } }
このようのwriteArray、writeTreeが好きJsonGeneratorは、複合型のJSONの生成をサポート書くためのいくつかの方法があります。あなたはcreateGeneratorのJsonFactory()によって、別のJsonGeneratorを作成したい場合。
- カスタムデシリアライズクラス。デシリアライズクラス定義が必要か、直接または間接的にStdDeserializer StdDeserializerは、継承しているのでJsonParserを使用する必要がJSON、オーバーライドメソッドデシリアライズを読み取りながら、次のように、一例です。
リスト9.カスタム直列化復元
パブリック クラス CustomDeserializerは延びStdDeserializer <人> { @Override 公共人物デシリアライズ(JsonParserの特許、DeserializationContext CTXT)が スローにIOException、JsonProcessingException { JsonNodeノード = jp.getCodec()readTree(JP)。 人の人 = 新しい人(); int型の年齢=(整数)(。(IntNode)ノードを取得(" 年齢" ))numberValue(); 文字列名 =ノード。取得(" 名前" ).asTextを(); person.setAge(年齢); person.setName(名); 戻り者; } }
JsonParserのJSONは、閉じられ()、のnextToken()などの情報を読むために多くの方法を提供していますgetValueAsString()などが挙げられます。あなたはcreateParserのJsonFactory()によって、別のJsonParserを作成したい場合。
- グッドあなたがプログラムでそれらを呼び出したい場合は、カスタムシリアライゼーションクラスとカスタム直列化復元のクラスを定義するだけでなく、モジュールObjectMapper、以下の例を登録する必要があります:
10.登録M odule例のリスト
Module1を= SimpleModule 新しい新 SimpleModule(" MyModuleという" ); module.addSerializer(新新 customserializer(人。クラス)); module.addDeserializer(。人クラス、新しい新CustomDeserializer()); mapper.registerModule(Module1の); また、注釈の方法により、属性に追加、上記の方法またはクラスのJavaオブジェクトは、それらを呼び出すために (@JsonSerializeを使用して = customserializer。クラス) @JsonDeserialize(使用 = CustomDeserializer。クラス) のパブリック クラスの人
プロセス・モデルツリー
ジャクソンはまた、生成したJSONを解析するためにモデルツリー(ツリーモデル)を提供します。あなたがアクセスしたり、プロパティのJSONの一部を変更したい場合は、ツリーモデルは良い選択です。JsonNodeツリーモデルは、ノードで構成されています。次のようにプログラムを頻繁に使用ObjectNodeは、ObjectNodeはJsonNodeを継承し、例を示します。
10. ObjectNode模範的な作成と解析JSONリスト
ObjectMapperマッパー= 新しいObjectMapper(); // 构建ObjectNode ObjectNode personNode = mapper.createObjectNode()。 // 添加/更改属性 personNode.put(" 名前"、" トム" ); personNode.put(" 年齢"、40 ); ObjectNode addressNode = mapper.createObjectNode()。 addressNode.put(" ジッパー"、" 000000 " )。 addressNode.put(" ストリート"、南京路は" ); // 子ノードを設定 。personNode SET(" アドレス"addressNodeを); // ノードのパスを見つける JsonNode searchNode = personNode.path(" ストリート" ); // プロパティを削除 ((ObjectNode)personNode)を。削除(" アドレス" ); // JSON読ん ルートノード= JsonNodeをmapper.readTree(personNode.toString()); // JsonNodeは、Javaオブジェクトに変換する 人人= mapper.treeToValue(personNode、人。クラス); // JavaのJsonNodeに変換オブジェクト JsonNodeノード= mapper.valueToTree(人)。
概要
まず、他のJavaフレームJSONと比較することによって、それはジャクソンの利点を説明し、そしてコアモジュールの組成、及び各セクションの役割を記載しています。次に、一例として、本明細書の基本的な使い方・ジャクソン、書き込みをObjectMapper説明し、メソッドを読み、ObjectMapper構成情報のセット、および注釈を使用してパッケージジャクソンの注釈を説明します。最後に、本論文では詳細に、この記事の焦点である高次ジャクソン、の使用を記載しています。これらは、より高次の日付形式は処理の異なるタイプ(通常タイプの日付、日付型のJDK 8、ジョダ日付型)、および他の一般的な一覧と地図デシリアライゼーション、視覚的な管理プロパティ、ジャクソンの3つのプロパティを使用しています含めますフィルタリング、カスタムのシリアライズとデシリアライズツリーモデルの実装と使用。体系的にこの記事を説明することで、私は読者がジャクソンのより深いかつ包括的な把握していると信じています。