我在CXF中使用Jackson来序列化/反序列化数据。不幸的是,我很难配置CXF / Jackson来反序列化JSON数组。我很感激帮助解决这个问题。
到目前为止,大多数json数据都是对象格式,即
{ "objectCollection": [ {...}, {...}, {...}... ] }
但是,有问题的json数据的形式如下:
[ {...}, {...}, {...} ]
Web服务端点需要“GroupsDto”对象(请参阅下文) 它有一个属性 - 一组组,即 通过JSON数组传输。
@PATH(...)
public Response createGroups(GroupsDto groups) {
...
}
我将@JsonDeserialize如下添加到GroupsDto集合属性中,但它不起作用。我继续说:“无法将GroupsDto的实例反序列化为START_ARRAY标记”
public class GroupsDto {
private Collection<GroupDto> groups;
/**
* @return the groups
*/
@XmlElement(name="group")
@JsonDeserialize(contentAs=GroupDto.class)
public Collection<GroupDto> getGroups() {
return groups;
}
...
}
答案 0 :(得分:8)
如果json数据的格式为:
[ {...}, {...}, {...} ]
你必须使用添加另一个类说'wrapper':
@JsonIgnoreProperties(ignoreUnknown = true)
public class ListDto extends ArrayList<GroupDto> {
public ListDto() {
}
}
在取消选择时使用这个课程。这种方法对我有用。
答案 1 :(得分:1)
您只需在 setter 中指定@JsonDeserialize(contentAs=GroupDto.class)
即可。序列化始终在获取反序列化始终在设置,或者如果您愿意,您可以在字段上指定两者。
代码示例:
import java.io.IOException;
import java.util.List;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonDeserialize;
public class JacksonDeserialize {
public static class ModelClass {
private String name;
public ModelClass() {
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public ModelClass(final String name) {
super();
this.name = name;
}
@Override
public String toString() {
return "ModelClass [name=" + name + "]";
}
}
public static class ListModelClass {
private List<ModelClass> list;
@JsonDeserialize(contentAs = ModelClass.class)
public void setList(final List<ModelClass> list) {
this.list = list;
}
@Override
public String toString() {
return "ListModelClass [list=" + list + "]";
}
}
public static void main(final String[] args) throws JsonGenerationException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
System.out.println(objectMapper.readValue("{\"list\":[{\"name\":\"name1\"},{\"name\":\"name2\"}]}",
ListModelClass.class));
}
}