Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RestTemplate如何解析响应_Java_Spring_Pojo_Resttemplate - Fatal编程技术网

Java RestTemplate如何解析响应

Java RestTemplate如何解析响应,java,spring,pojo,resttemplate,Java,Spring,Pojo,Resttemplate,在开发spring REST客户端时,出现了一个问题: 我有下一个问题: 要保存用户的模型类: @JsonIgnoreProperties(ignoreUnknown=true) 公共类用户{ 公共用户(){ } 私有布尔管理; 私有字符串别名; 私人字符串电子邮件; 私有字符串emailId; 私有ArrayList组; 私有字符串id; 私有布尔锁; 私有整数loggedInCount; 私有布尔主控; 私人字符串短信; 私有字符串smsId; 私有字符串类型; 私有字符串用户名; //

在开发spring REST客户端时,出现了一个问题:

  • 我有下一个问题:

  • 要保存用户的模型类:

    @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;
    
       ....
    }
    
  • 从“主键是结果”开始:

    a。如果您只处理此类web服务中的一种,我将为实际负载创建一个包装器类:

    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
    }
    
  • 对于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;
        }
    }
    
  • 祝你好运

  • 从“主键是结果”开始:

    a。如果您只处理此类web服务中的一种,我将为实际负载创建一个包装器类:

    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
    }
    
  • 对于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;
        }
    }
    
  • 祝你好运

    您还可以使用该库在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(){});
    
    您还可以使用该库在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根名称命名,会产生什么效果?或者这只是为了读取(获取)数据。