2016-09-22 30 views
0

私のプロジェクトでは、Jersey 2.23.1をJSONサポート用にジャクソンと共に使用しています。Jersey + Jacksonはデシリアライズ時にnullを取り除きます

{"foo":null、 "bar": "123"}のようなリクエストをJSONとして取得したとき、クラスAと一致する{String foo; String bar;} JerseyはまずAのインスタンスを作成し(コンストラクタで指定されている場合はデフォルト値で)、JSONを一時オブジェクトA 'に逆シリアル化し、JSONで指定されたすべてのJSONフィールドをA'からAにコピーします。 Aクラスのコンストラクタのデフォルト値で、JSONのフィールドがnullの場合、すべてのデフォルト値が消去され、nullに置き換えられます(前の例では、 "foo"フィールドのデフォルト値がある場合、オブジェクトのnullによって、Jerseyは@Path Annotedメソッドのparamとして返されます)。

Response中にnull filedsの転送を避けるために、Aクラスに@JsonInclude(Include.NON_NULL)を使用しています。しかし、それは直列化のためにのみ動作します、逆直列化についてはどうですか?つまり、JSONの結果としてフィールドが "foo" = nullになり、デシリアライズ後に新しいオブジェクトインスタンスに{"foo":null}があるとします。ここで

本のすべて合計するいくつかのコードです:私はJSON

(コントローラで)私の方法に

{ "id":null, "lastName":null, "firstName":"Random First Name", "role":"STUDENT" }

のこの種を渡している場合、 `

@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonInclude(value = Include.NON_NULL) 
public class User { 
    public enum EUserRole { 
     PARENT, STUDENT, PROF, ADMIN 
    } 

    @Id 
    public String id; 
    public String firstName; 
    public String lastName; 
    public EUserRole role; 

    public User() { 
     id = ObjectId.get().toString(); 
     role = EUserRole.STUDENT; 
     lastName = "RandomLastName"; 
    } 
} 

` を

@POST public Response createUser(final User entity) { }

これは、JSONのすべてのnullフィールドが自分のエンティティでnullに設定され、コンストラクタのデフォルト値に設定されないという結果に終ります。

デシリアライズ時にnullフィールドを無視するようにジャクソンを指定する方法があるかどうか知っていますか?それともジャージー関連の行動ですか?含まれている値に基づいて、その意味でJSONペイロードからのデータを無視する方法はありません

答えて

0

乾杯、(あなただけの特定のプロパティのすべての値を無視するignoralを使用することができます)。 ヌル割り当てを避けたい場合は、nullの値を呑み込む(つまり、null以外を割り当てる)セッターを定義する必要があります。 null割り当てられることを防止するために

能力のようなもの、@JsonFormat.Featureを経由して追加する便利な機能があります

// hypothetical no such feature exists yes 
@JsonFormat(without = JsonFormat.Feature.ALLOW_NULL_ASSIGNMENT) 

はので、おそらくこれは機能要求である可能性があります。

これはプロパティごとの処理に属していると思うのは、これが一部のプロパティの特定のルールのように思えるからです。ユーザーが本当にそのようなヌル・ノン・アクトを好むように見える場合は、おそらくは一致するグローバル設定もあるかもしれません。

関連する問題