使用Jackson将JSON字符串数组映射到List <string>

时间:2016-05-12 12:50:27

标签: json jackson

我有从服务器返回的JSON。

 String json = {
    "values": ["name","city","dob","zip"]
 };

我想使用ObjectMapper返回List<String>值。类似的东西:

List<String> response = mapper.readValue(json, List.class)

我尝试了几种方法,但没有一种方法可行。任何帮助表示赞赏。

编辑:我不想要其他包装器对象。我想立即取出List<String>

3 个答案:

答案 0 :(得分:22)

Jackson中的TypeFactory允许直接映射到集合和其他复杂类型:

String json = "[ \"abc\", \"def\" ]";
ObjectMapper mapper = new ObjectMapper();

List<String> list = mapper.readValue(json, TypeFactory.defaultInstance().constructCollectionType(List.class, String.class));

答案 1 :(得分:6)

您可以按如下方式定义包装类:

public class Wrapper {

    private List<String> values;

    // Default constructor, getters and setters omitted
}

然后使用:

Wrapper wrapper = mapper.readValue(json, Wrapper.class);
List<String> values = wrapper.getValues();

如果要避免使用包装器类,请尝试以下操作:

JsonNode valuesNode = mapper.readTree(json).get("values");

List<String> values = new ArrayList<>();
for (JsonNode node : valuesNode) {
    values.add(node.asText());
}

答案 2 :(得分:0)

您可能会对另一种方式感兴趣,与接受的答案部分相似,但是可以单线编写(换行符有助于理解)。

输入JSON:

{
    "values": ["name", "city", "dob", "zip"]
}

代码段:

String json = "{\"values\":[\"name\",\"city\",\"dob\",\"zip\"]}";
ObjectMapper mapper = new ObjectMapper();

List<String> list = Arrays.asList(
    mapper.convertValue(
        mapper.readTree(json).get("values"),
        String[].class
    )
);

list.forEach(System.out::println);

此代码段输出以下内容:

name
city
dob
zip

请注意,Arrays.asList()返回一个固定大小的列表,因为它由给定数组支持。要获得可调整大小的列表,只需像这样包装它:

List<String> resizableList = new ArrayList<>(
    Arrays.asList(new String[] {"a", "b", "c"})
);

当然,此解决方案可以适应更复杂的情况,而不仅仅是String

例如,对于给定的POJO User

class User {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return String.format(
            "[User = {id: %d, name: \"%s\"}]",
            id,
            name
        );
    }
}

并输入JSON:

{
    "values": [{
            "id": 1,
            "name": "Alice"
        }, {
            "id": 2,
            "name": "Bob"
        }
    ]
}

以下代码段:

ObjectMapper mapper = new ObjectMapper();
String json = "{\"values\":[{\"id\":1,\"name\":\"Alice\"},{\"id\":2,\"name\":\"Bob\"}]}";

List<User> list = Arrays.asList(
    mapper.convertValue(
        mapper.readTree(json).get("values"),
        User[].class
    )
);

list.forEach(System.out::println);

产生以下输出:

[User = {id: 1, name: "Alice"}]
[User = {id: 2, name: "Bob"}]