2017-05-12 6 views
2

ドメインレベルのオブジェクトに対して個別のPOJOクラスを作成するのではなく、実行時にJSONレスポンスのキー名を動的にカスタマイズできますか?Jacksonはカスタマイズ可能なキー名でJSONにシリアル化できますか?

Web StartterでSpring Boot 1.5.3を使用しているため、Jacksonの依存関係が含まれています。私はJSONで回答を返しています。通常、キー名をカスタマイズする必要がある場合は、Jackson注釈を使用して個々のPOJOクラスを作成します。例えば、

私は次のコードで @RestControllerからこれを返すのです
public class Movies { 

    private List<String> movies; 

    public Movies(List<String> movies) { 
     this.movies = movies; 
    } 

    public List<String> getMovies() { 
     return this.movies; 
    } 

    public void setMovies(List<String> movies) { 
     this.movies = movies; 
    } 
} 

{ "movies" : [ "Iron Man", "Spiderman", "The Avengers", "Captain America" ] } 

@RestController 
public class MoviesController { 

    @Service 
    private MovieService movieService; 

    @RequestMapping("/movies/list") 
    public ResponseEntity<Movies> getMovies() { 
     return new ResponseEntity<Movies>(this.movieService.getMovies(), HttpStatus.OK); 
    } 
} 

は、私は戻って、このエンドポイントを呼び出すJSONレスポンスを取得します私はMovies POJOを作成したくありません。 @JsonProperty注釈を経由してキー名をハードコーディングとは対照的に、GenericResponseをインスタンス化しながら、私は何とか私が望む任意のキー名を送信することができます

public class GenericResponse { 

    @JsonProperty("movies") // <- this needs to be dynamic 
    private List<String> data; 
    ... 
} 

...:代わりに、私は一般的な型指定されたPOJOを持っていると思います。それは可能ですか?

答えて

1

Map<String, List<String>>MoviesGenericResponseを交換し、その後

map.put("movies", Arrays.asList("Iron Man", "Spiderman", "The Avengers", "Captain America")); 

Mapは、フィールド名、およびマップ値とフィールド値としてマップのキーで、JSONオブジェクトとしてJSONにシリアライズされません。

+0

これは完全に機能しました。ありがとう! –

1

マップでこれを行うのはどうですか?

public class GenericResponse { 
    @JsonValue 
    private Map<String, List<String>> data; 
    } 

@JsonValueアノテーションを使用して、「データ」フィールド名を無視することができます。

関連する問題