在我的REST 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",...]}。也就是说,我认为我需要更改TextItem,以便它可以是String或上述类。

如何实现呢?

最佳答案

如果您不介意在两种情况下都是同一类(TextItem),那么最简单的选择是使用单个字符串参数再添加1个TextItem构造函数。

这是演示:

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(data = [TextItem(count = 123,text = abc)])
  
  MyRequestItem(data = [TextItem(count = 0,text = abc)])

09-16 02:56