接受Web服务中的多种JSON格式

时间:2017-12-07 16:24:05

标签: java json jackson

在我的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或上述类。

如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

如果你不介意它是两个案例(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)])