jackson 如何反序列化JSON数组?

whlutmcx  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(238)

我在CXF中使用Jackson来序列化/反序列化数据。不幸的是,我在配置CXF/Jackson来反序列化JSON数组时遇到了困难。我希望能得到帮助来解决这个问题。
到目前为止,大多数json数据都是对象格式,即
{ "objectCollection": [ {...}, {...}, {...}... ] }
但是,所讨论的json数据的形式为:
[ {...}, {...}, {...} ]
Web服务端点需要一个“GroupsDto”对象(请参见下文),该对象具有一个属性--组的集合,该属性通过JSON数组传输。

@PATH(...)
public Response createGroups(GroupsDto groups) {
...
}

我将@JsonDeserialize添加到GroupsDto集合属性中,如下所示,但它不起作用。我继续得到:“无法在START_ARRAY标记之外反序列化GroupsDto的示例”

public class GroupsDto {

       private Collection<GroupDto> groups;

       /**
        * @return the groups
        */
       @XmlElement(name="group")
       @JsonDeserialize(contentAs=GroupDto.class)
       public Collection<GroupDto> getGroups() {
               return groups;
       }
...
}
093gszye

093gszye1#

如果json数据的格式为:

[ {...}, {...}, {...} ]

您必须使用添加另一个类,例如'wrapper':

@JsonIgnoreProperties(ignoreUnknown = true)
public class ListDto extends ArrayList<GroupDto> {

    public ListDto() {
    }
}

并在反序列化时使用这个类。这种方法对我很有效。

mqkwyuun

mqkwyuun2#

你只需要在你的setter中指定@JsonDeserialize(contentAs=GroupDto.class)。序列化总是在getdeserialization总是在set,或者如果你愿意,你可以在字段中同时指定这两个。
SerializeDeserialize的说明文件
代码示例:

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));
    }

}
brtdzjyr

brtdzjyr3#

不使用 Package 类

使用Jackson的对象Map器

objectMapper.readValue();

数据如下...

[... , {YourObj} , {YourObj} , ... ]

你可以

YourObj[] yourObjArray = objectMapper.readValue(source, YourObj[].class);

如果你想把它转换成一个列表,你可以进一步这样做

List<YourObj> yourObjList = Arrays.stream(yourObjArray).collect(Collectors.toList())

参考https://www.baeldung.com/jackson-collection-array

相关问题