我有从服务器返回的JSON。
String json = {
"values": ["name","city","dob","zip"]
};
我想使用ObjectMapper
返回List<String>
值。类似的东西:
List<String> response = mapper.readValue(json, List.class)
我尝试了几种方法,但没有一种方法可行。任何帮助表示赞赏。
编辑:我不想要其他包装器对象。我想立即取出List<String>
。
答案 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"}]