22

オブジェクトマッパーでJacksonのreadValue()メソッドを使用して、JSONファイルから読み取り、Javaオブジェクトに変換しています。

例えば。

mapperObject.readValue( node, MyTargetClass.class )

必要な属性を適用するためにMyTargetClassに設定できる注釈はありますか?たとえば、プロパティがABC、DEF、GHIのJSONオブジェクトがあり、Jsonが次の場合

{
  "ABC" : "somevalue"
  "DEF" : "someothervalue" 
}

どういうわけか失敗し、ABC、DEF、GHIが含まれている場合にのみreadValueで成功するようにします。

4

4 に答える 4

20

アノテーションを使用してプロパティを必須としてマークでき@JsonProperty(required = true)ます。プロパティが欠落しているかnullの場合、逆シリアル化中にJsonMappingExceptionがスローされます。

編集:コメントなしでこれに対する反対票を受け取りました。それは正確に正しいことをするので、私は理由を知りたいです。

于 2016-08-24T17:59:41.960 に答える
17

Jacksonには検証機能が含まれていません。これは仕様によるものです(つまり、範囲外と見なされます)。しかし、通常使用されるのはBeanValidationAPIの実装です。これの良いところは、データ形式の処理と検証ロジックの間の分離です。これは、DropWizardのようなフレームワークが使用するものです。そしてそれは、JAX-RS(Jerseyのような)がJAX-RS2.0のために物事を進めている方向です。

于 2012-12-07T18:16:12.417 に答える
5

jsonフィールドが提供されていることを確認する場合は@JsonProperty(value = "fieldName", required = true)、コンストラクターへのパラメーターとしてアノテーションを使用する必要があります。しかし、これだけでは不十分です。コンストラクターにも@JsonCreator注釈を付ける必要があります。

たとえば、' endPoint'という名前のフィールドがあり、それがJSONファイルで提供されていることを確認したい場合、次のコードは、提供されていない場合に例外をスローします。

@JsonCreator
public QuerySettings(@JsonProperty(value = "endPoint", required = true) String endPoint) {
        this.endPoint = endPoint;
}

このリンクは、Jacksonアノテーションを理解するのに役立ちました。また、required = trueが十分でなく、その名前に反直観的である理由もよく説明されています。

于 2019-07-02T14:17:19.493 に答える
0

@JsonProperty(required = true)Bean Validationでのみ機能するため、またはBean Validationの使用に満足できない場合は@JsonCreator、関連する変数のセッターメソッドでこれをキャッチするのがもう1つの方法です。

変数を設定する前に変数がnullであるかどうかを確認し、IllegalArgumentExceptionorをスローすることができますNullPointerException(少数の人が好むように)

注:POJOがどのように定義されているかにも依存するため、このソリューションが機能するためには、setterメソッドルートを使用していることを確認してください。

于 2021-09-23T08:47:33.270 に答える