2017-12-07 15 views
1

私のREST Webサービスでは、2つの異なる構造を持つJSONを受け入れる必要があります。Webサービスで複数のJSON形式を受け入れる

現在、私は持っている:

@Path("/") 
public class MyAppResource { 
    ... 
    @Context private HttpServletRequest request; 
    ... 
    @POST 
    @Produces(MediaType.APPLICATION_JSON) 
    public MyResponseItem check(MyRequestItem body) { 
     ... 
    } 
} 

public class MyRequestItem { 
    ... 
    @JsonCreator 
    public MyRequestItem(@JsonProperty("data") ArrayList<TextItem> data) { 
     ... 
    } 
    ... 
} 

class TextItem { 
    ... 
    @JsonCreator 
    public TextItem(@JsonProperty("count") int count, 
        @JsonProperty("text") String text) { 
     ... 
    } 
    ... 
} 

だから、フォーム{"data":[{"count":123,"text":"abc"},...]}のJSONを受け入れます。

上記のフォーマットに加えて、私はこのフォーマットを受け入れる必要があります:{"data":["abc",...]}。つまり、Stringまたは上記のクラスのいずれかになるように、TextItemを変更する必要があると思います。

これを行うには?

答えて

1

両方のケースで同じクラスであることに気にしない場合(TextItem)、最も簡単なオプションは、1つの文字列引数を持つTextItemコンストラクタを1つ追加することです。

public class Main { 
    public static String json1 = "{\"data\":[{\"count\":123,\"text\":\"abc\"}]}"; 
    public static String json2 = "{\"data\":[\"abc\"]}"; 
    public static void main(String[] args) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     System.out.println(mapper.readValue(json1, MyRequestItem.class)); 
     System.out.println(mapper.readValue(json2, MyRequestItem.class)); 
    } 

    @Data // lombok.Data; 
    @ToString // lombok.ToString; 
    public static class MyRequestItem { 
     private List<TextItem> data; 
     @JsonCreator 
     public MyRequestItem(@JsonProperty("data") ArrayList<TextItem> data) { 
      this.data = data; 
     } 
    } 

    @Data 
    @ToString 
    public static class TextItem { 
     private int count; 
     private String text; 
     @JsonCreator 
     public TextItem(@JsonProperty("count") int count, 
         @JsonProperty("text") String text) { 
      this.count = count; 
      this.text = text; 
     } 

     // this is the only thing you need to add to make it work 
     public TextItem(String text) { 
      this.text = text; 
     } 
    } 
} 

結果:

MyRequestItem(データ= [TextItem(カウント= 123、テキスト= ABC)])

MyRequestItem(データ= [TextItemここ

デモあります(カウント= 0、テキスト= abc)])

関連する問題