在我的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)])