1

我正在使用 Spring 框架通过 Http GET 将 JSON 数据从本地服务器获取到对象中。但对象始终为空(未存储数据)

  • 我已经仔细检查了服务器,它工作正常
  • 服务器返回{"Propid":"61", "Proptitle":"3 bhk villa","Propdealer":"admin"}
  • 我添加了杰克逊图书馆
  • 我使用过 StringHttpMessageConverter 它返回 JSON 字符串{"Propid":"61", "Proptitle":"3 bhk villa","Propdealer":"admin"}

抛出异常:Could not extract response: no suitable HttpMessageConverter found for response type [com.aditya.master.classes.Prop] and content type [text/html;charset=UTF-8]

这是解析 JSON 响应的代码

URI targetUrl= UriComponentsBuilder.fromUriString("http://192.168.1.9/PinSpace/oauth/")
                    .path("request_access/")
                    .queryParam("query", "get_property")
                    .queryParam("access_token", auth_code)
                    .queryParam("prop_id", "61")
                    .build()
                    .toUri();

            HttpHeaders requestHeaders = new HttpHeaders();
            requestHeaders.setAccept(Collections.singletonList(new MediaType("application", "json")));
            HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);


            RestTemplate restTemplate = new RestTemplate();

            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());


            ResponseEntity<Prop> responseEntity = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, Prop.class);
            Prop result = responseEntity.getBody();

这是道具类

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Prop {

@JsonProperty
private String Propid, Proptitle, Propdealer;


public String getPropid() {
    return Propid;
}

public void setPropid(String propid) {
    Propid = propid;
}

public String getProptitle() {
    return Proptitle;
}

public void setProptitle(String proptitle) {
    Proptitle = proptitle;
}

public String getPropdealer() {
    return Propdealer;
}

public void setPropdealer(String propdealer) {
    Propdealer = propdealer;
}
}

请提出解决方案

谢谢!

4

2 回答 2

1

您可以使用以下代码测试反序列化:

ObjectMapper objectMapper = new ObjectMapper();
        String content = "{\"Propid\":\"61\", \"Proptitle\":\"3 bhk villa\",\"Propdealer\":\"admin\"}";
        objectMapper.readValue(content , Prop.class);

这会引发异常

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "Propid"

这意味着您的类中的字段命名不正确,或者您需要在 @JsonProperty 注释中指向正确的名称

我建议你使用下一个结构:

public class Prop {

    private String propid;
    private String proptitle;
    private String propdealer;

    public String getPropid() {
        return propid;
    }

    @JsonProperty("Propid")
    public void setPropid(String propid) {
        this.propid = propid;
    }

    public String getProptitle() {
        return proptitle;
    }

    @JsonProperty("Proptitle")
    public void setProptitle(String proptitle) {
        this.proptitle = proptitle;
    }

    public String getPropdealer() {
        return propdealer;
    }

    @JsonProperty("Propdealer")
    public void setPropdealer(String propdealer) {
        this.propdealer = propdealer;
    }

}
于 2013-05-31T10:27:32.760 回答
0

也有一种方法可以使它与不正确的 MIME 类型一起使用:您只需将“text/html”添加到您接受的媒体类型列表中。像这样:

MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
List<MediaType> mediaTypeList = new ArrayList<MediaType>();
//...
mediaTypeList.addAll( jsonConverter.getSupportedMediaTypes() );
mediaTypeList.add(MediaType.TEXT_HTML);
jsonConverter.setSupportedMediaTypes(mediaTypeList);

如果您无权访问服务器,这将非常方便。

笔记

可能有一种不那么冗长的方法来做到这一点,但我在其他环境中工作了 10 年后才回到 Java :-)

于 2014-01-07T04:08:38.743 回答