RestTemplate 如何解析响应
How RestTemplate parse response
开发springREST Client时,出现问题:
- 我有下一个json:
{
"return": [
{
"admin": false,
"alias": "",
"email": "",
"emailId": {"value": 0},
"groups": [],
"id": {"value": 1},
"locked": false,
"loggedInCount": 0,
"master": true,
"sms": "",
"smsId": {"value": 0},
"type": "POWER",
"username": "NGCP"
},
{
"admin": false,
"alias": "",
"email": "",
"emailId": {"value": 0},
"groups": [{"value": 2}],
"id": {"value": 3},
"locked": false,
"loggedInCount": 0,
"master": false,
"sms": "",
"smsId": {"value": 0},
"type": "POWER",
"username": "POLICY"
}
]
}
要保存的模型 class 用户:
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
public User(){
}
private boolean admin;
private String alias;
private String email;
private String emailId;
private ArrayList<String> groups;
private String id;
private boolean locked;
private int loggedInCount;
private boolean master;
private String sms;
private String smsId;
private String type;
private String userName;
//getter and setters
}
现在我正在使用 "RestTemplate" 来获取结果。
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<User[]> response = restTemplate.exchange(URL_GET,HttpMethod.GET,request, User[].class);
并得到错误。我知道那是因为主键是 "result" 但我可以指定 restTemplate 应该从哪里解析这个 JSON 吗?
是否可以在提交的文章中注明点赞 "emailId" 以获得直接价值?一些模板?
您可以使用注释@JsonRootName 来指定响应中的根元素。所以试试这个:
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName(value ="result")
public class User {
public User(){
}
private boolean admin;
....
}
截至 "main key is result":
一个。如果您只处理其中一种 Web 服务,我会为实际负载创建一个包装器 class:
public class Return{
// Class property cannot be called "return" because it is Java reserved name.
@JsonProperty("return")
private User[] array;
.... getter and setter
}
b。如果您处理多个 Web 服务,其中实际负载位于 "return" 字段中,我将创建一个通用包装器 class :
public class Return<T>{
// Class property cannot be called "return" because it is Java reserved name.
@JsonProperty("return")
private T[] array;
.... getter and setter
}
致电RestRemplate
:
ResponseEntity<Return<User>> response = restTemplate.exchange(URL_GET,
HttpMethod.GET, request, new ParameterizedTypeReference<Return<User>>(){});
User[] usersArray = response2.getBody().getArray();
从 JSON 属性中的 属性 值开始,名为 "value" 我将创建两个自定义 JsonDeserializer
(s):一个用于单个值一个用于值数组,并在适用的地方用 @JsonDeserialize
注释每个 属性:
单值反序列化器:
public class StringValueDeserializer extends JsonDeserializer<String>{
@Override
public String deserialize(JsonParser parser, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
ObjectCodec codec = parser.getCodec();
TreeNode node = codec.readTree(parser);
JsonNode value = (JsonNode)node.get("value");
if (value != null){
return value.asText();
}
return null;
}
}
数组值反序列化器:
public class StringArrayValueDeserializer extends JsonDeserializer<List<String>>{
@Override
public List<String> deserialize(JsonParser parser, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
List<String> ret = new ArrayList<>();
ObjectCodec codec = parser.getCodec();
TreeNode node = codec.readTree(parser);
if (node.isArray()){
for (JsonNode n : (ArrayNode)node){
JsonNode value = n.get("value");
if (value != null){
ret.add(value.asText());
}
}
}
return ret;
}
}
你是新来的User.class
:
public class User {
private boolean admin;
private String alias;
private String email;
@JsonDeserialize(using = StringValueDeserializer.class)
private String emailId;
@JsonDeserialize(using = StringArrayValueDeserializer.class)
private ArrayList<String> groups;
@JsonDeserialize(using = StringValueDeserializer.class)
private String id;
private boolean locked;
private int loggedInCount;
private boolean master;
private String sms;
@JsonDeserialize(using = StringValueDeserializer.class)
private String smsId;
private String type;
private String username;
.... getter and setter
}
祝你好运!
您还可以使用 JsonPath 库在 json 中导航:
String json = restTemplate.exchange(URL_GET,HttpMethod.GET,request, String.class);
DocumentContext document = JsonPath.parse(content, json);
List<User> users = document.read("$.return.*", new TypeRef<List<User>>() {});
开发springREST Client时,出现问题:
- 我有下一个json:
{
"return": [
{
"admin": false,
"alias": "",
"email": "",
"emailId": {"value": 0},
"groups": [],
"id": {"value": 1},
"locked": false,
"loggedInCount": 0,
"master": true,
"sms": "",
"smsId": {"value": 0},
"type": "POWER",
"username": "NGCP"
},
{
"admin": false,
"alias": "",
"email": "",
"emailId": {"value": 0},
"groups": [{"value": 2}],
"id": {"value": 3},
"locked": false,
"loggedInCount": 0,
"master": false,
"sms": "",
"smsId": {"value": 0},
"type": "POWER",
"username": "POLICY"
}
]
}
要保存的模型 class 用户:
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
public User(){
}
private boolean admin;
private String alias;
private String email;
private String emailId;
private ArrayList<String> groups;
private String id;
private boolean locked;
private int loggedInCount;
private boolean master;
private String sms;
private String smsId;
private String type;
private String userName;
//getter and setters
}
现在我正在使用 "RestTemplate" 来获取结果。
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<User[]> response = restTemplate.exchange(URL_GET,HttpMethod.GET,request, User[].class);
并得到错误。我知道那是因为主键是 "result" 但我可以指定 restTemplate 应该从哪里解析这个 JSON 吗?
是否可以在提交的文章中注明点赞 "emailId" 以获得直接价值?一些模板?
您可以使用注释@JsonRootName 来指定响应中的根元素。所以试试这个:
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName(value ="result")
public class User {
public User(){
}
private boolean admin;
....
}
截至 "main key is result":
一个。如果您只处理其中一种 Web 服务,我会为实际负载创建一个包装器 class:
public class Return{ // Class property cannot be called "return" because it is Java reserved name. @JsonProperty("return") private User[] array; .... getter and setter }
b。如果您处理多个 Web 服务,其中实际负载位于 "return" 字段中,我将创建一个通用包装器 class :
public class Return<T>{ // Class property cannot be called "return" because it is Java reserved name. @JsonProperty("return") private T[] array; .... getter and setter }
致电
RestRemplate
:ResponseEntity<Return<User>> response = restTemplate.exchange(URL_GET, HttpMethod.GET, request, new ParameterizedTypeReference<Return<User>>(){}); User[] usersArray = response2.getBody().getArray();
从 JSON 属性中的 属性 值开始,名为 "value" 我将创建两个自定义
JsonDeserializer
(s):一个用于单个值一个用于值数组,并在适用的地方用@JsonDeserialize
注释每个 属性:单值反序列化器:
public class StringValueDeserializer extends JsonDeserializer<String>{ @Override public String deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException { ObjectCodec codec = parser.getCodec(); TreeNode node = codec.readTree(parser); JsonNode value = (JsonNode)node.get("value"); if (value != null){ return value.asText(); } return null; } }
数组值反序列化器:
public class StringArrayValueDeserializer extends JsonDeserializer<List<String>>{ @Override public List<String> deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException { List<String> ret = new ArrayList<>(); ObjectCodec codec = parser.getCodec(); TreeNode node = codec.readTree(parser); if (node.isArray()){ for (JsonNode n : (ArrayNode)node){ JsonNode value = n.get("value"); if (value != null){ ret.add(value.asText()); } } } return ret; } }
你是新来的
User.class
:public class User { private boolean admin; private String alias; private String email; @JsonDeserialize(using = StringValueDeserializer.class) private String emailId; @JsonDeserialize(using = StringArrayValueDeserializer.class) private ArrayList<String> groups; @JsonDeserialize(using = StringValueDeserializer.class) private String id; private boolean locked; private int loggedInCount; private boolean master; private String sms; @JsonDeserialize(using = StringValueDeserializer.class) private String smsId; private String type; private String username; .... getter and setter }
祝你好运!
您还可以使用 JsonPath 库在 json 中导航:
String json = restTemplate.exchange(URL_GET,HttpMethod.GET,request, String.class);
DocumentContext document = JsonPath.parse(content, json);
List<User> users = document.read("$.return.*", new TypeRef<List<User>>() {});