Java RestTemplate如何解析响应
在开发spring REST客户端时,出现了一个问题:Java RestTemplate如何解析响应,java,spring,pojo,resttemplate,Java,Spring,Pojo,Resttemplate,在开发spring REST客户端时,出现了一个问题: 我有下一个问题: 要保存用户的模型类: @JsonIgnoreProperties(ignoreUnknown=true) 公共类用户{ 公共用户(){ } 私有布尔管理; 私有字符串别名; 私人字符串电子邮件; 私有字符串emailId; 私有ArrayList组; 私有字符串id; 私有布尔锁; 私有整数loggedInCount; 私有布尔主控; 私人字符串短信; 私有字符串smsId; 私有字符串类型; 私有字符串用户名; //
要保存用户的模型类:
@JsonIgnoreProperties(ignoreUnknown=true)
公共类用户{
公共用户(){
}
私有布尔管理;
私有字符串别名;
私人字符串电子邮件;
私有字符串emailId;
私有ArrayList组;
私有字符串id;
私有布尔锁;
私有整数loggedInCount;
私有布尔主控;
私人字符串短信;
私有字符串smsId;
私有字符串类型;
私有字符串用户名;
//二传手
}
现在我使用“RestTemplate”来获得结果。
RestTemplate RestTemplate=new RestTemplate();
ResponseEntity response=restemplate.exchange(URL\u 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;
....
}
您可以使用注释@JsonRootName在响应中指定根元素。所以试试这个:
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName(value ="result")
public class User {
public User(){
}
private boolean admin;
....
}
public class Return{
// Class property cannot be called "return" because it is Java reserved name.
@JsonProperty("return")
private User[] array;
.... getter and setter
}
b。如果您处理实际负载位于“return”字段中的多个Web服务,我将创建一个通用包装类:
public class Return<T>{
// Class property cannot be called "return" because it is Java reserved name.
@JsonProperty("return")
private T[] array;
.... getter and setter
}
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;
}
}
public class Return{
// Class property cannot be called "return" because it is Java reserved name.
@JsonProperty("return")
private User[] array;
.... getter and setter
}
b。如果您处理实际负载位于“return”字段中的多个Web服务,我将创建一个通用包装类:
public class Return<T>{
// Class property cannot be called "return" because it is Java reserved name.
@JsonProperty("return")
private T[] array;
.... getter and setter
}
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;
}
}
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>>() {});
String json=restemplate.exchange(URL\u GET,HttpMethod.GET,request,String.class);
DocumentContext document=JsonPath.parse(内容,json);
List users=document.read($.return.*),new TypeRef(){});
您还可以使用该库在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>>() {});
String json=restemplate.exchange(URL\u GET,HttpMethod.GET,request,String.class);
DocumentContext document=JsonPath.parse(内容,json);
List users=document.read($.return.*),new TypeRef(){});
您所说的“获取直接值”是什么意思?在这个字段中,我又有一对“key-value”。我只需要考虑一下错误是什么?“主键是结果”是什么意思?@Michael Wiles问题已经解决,请查看答案。当我谈到“主键”时,我指的是来自json的第一个键。错误是因为我没有对我的模型类进行正确的注释。您所说的“获取直接值”是什么意思?在这个字段中,我有一对“key-value”。我只需要考虑一下错误是什么?“主键是结果”是什么意思?@Michael Wiles问题已经解决,请查看答案。当我谈到“主键”时,我指的是来自json的第一个键。错误是因为我没有对我的模型类进行正确的注释。如果您使用用户对象创建或更新json根名称命名,会有什么影响?或者,这只是用于读取(获取)数据。如果使用用户对象创建或更新json根名称命名,会产生什么效果?或者这只是为了读取(获取)数据。