我试图找到一种从的有效载荷中解析嵌套属性的干净方法API。
API
这是JSON有效负载的粗略概括:
JSON
{ "root": { "data": { "value": [ { "user": { "id": "1", "name": { "first": "x", "last": "y" } } } ] } } }
我的目标是拥有User具有firstName和lastName字段的对象数组。
User
firstName
lastName
有人知道干净地解析此内容的好方法吗?
现在,我正在尝试创建一个Wrapper类,并在其中创建一个用于数据,值,用户等的静态内部类。
Wrapper
我restTemplate.exchange()用来呼叫端点。
restTemplate.exchange()
您需要使用JsonPath库,该库仅允许您选择必填字段,然后可以Jackson将原始数据转换为POJO类。解决方案示例如下所示:
Jackson
POJO
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.CollectionType; import com.jayway.jsonpath.JsonPath; import java.io.File; import java.util.List; import java.util.Map; public class JsonPathApp { public static void main(String[] args) throws Exception { File jsonFile = new File("./resource/test.json").getAbsoluteFile(); List<Map> nodes = JsonPath.parse(jsonFile).read("$..value[*].user.name"); ObjectMapper mapper = new ObjectMapper(); CollectionType usersType = mapper.getTypeFactory().constructCollectionType(List.class, User.class); List<User> users = mapper.convertValue(nodes, usersType); System.out.println(users); } } class User { @JsonProperty("first") private String firstName; @JsonProperty("last") private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } @Override public String toString() { return "User{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + '}'; } }
上面的代码打印:
[User{firstName='x', lastName='y'}]