杰克逊:将字符串数组反序列化为List<T>

7
对于一个 JSON 对象,Subject 表示:
{ 
    "permissions":["foo", "bar"],
    ...
}

我想要将其反序列化为:

class Subject {
    private List<Permission> permissions;
    ...

...其中Permission代表:

class Permission {
    ....
    public Permission(String permission) {
    ....
    }

Permission不是我控制的类,所以我只能处理构造函数。

我确信Jackson可以做到这一点,但我还没有找到最好的方法。我的ArrayDeserializer@JsonDeserialize(contentAs = Permission.class)尝试失败了,在我开始子类化JsonDeserializer之前,我想验证是否有内置功能可以实现这一点。

2个回答

12

最终我自己编写了反序列化程序。

public class PermissionDeserializer extends JsonDeserializer<List<Permission>> {

    @Override
    public List<Permission> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        if (jsonParser.getCurrentToken() == JsonToken.START_ARRAY) {
            List<Permission> permissions = new ArrayList<>();
            while(jsonParser.nextToken() != JsonToken.END_ARRAY) {
                permissions.add(new Permission(jsonParser.getValueAsString()));
            }
            return permissions;
        }
        throw deserializationContext.mappingException("Expected Permissions list");
    }
}

这个完美地解决了!我正在寻找一种方法来反序列化一个字符串数组,并根据所在地区更换新的字符串。 - speedynomads

2
这里有一个示例可以指导你。
Subject.java
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class Subject {

    public static void main(String[] args) throws Exception, JsonMappingException, IOException {
        String json = "{\"permissions\":[\"foo\", \"bar\"]}";
        ObjectMapper mapper = new ObjectMapper();
        Subject subject = mapper.readValue(json, Subject.class);

        for(Permission p:subject.getPermissions()){
            System.out.println(p.getPermission());
        }
    }

    private List<Permission> permissions = new ArrayList<Permission>();

    public List<Permission> getPermissions() {
        return permissions;
    }


    public void setPermissions(List<Permission> permissions) {
        this.permissions = permissions;
    }
}

Permission.java

class Permission {
    private String permission;

    public Permission(String permission) {
        this.permission = permission;
    }

    public String getPermission() {
        return permission;
    }

    public void setPermission(String permission) {
        this.permission = permission;
    }
}

构造函数的参数起了作用,你应该在你的回答中添加这个信息,一开始并不明显。 - A4L
@A4L 好久不见了,你能详细说明一下或自己修复吗? - Kevin Bowersox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接