我正在尝试使用Spring RestTemplate使用返回内容类型为application/json
的json字符串的服务。
响应如下:
============================response begin==========================================
response: 200 OK
Headers
Content-Length : 108
Content-Type : application/json; charset=utf-8
Response Body : "a string with double quotes, JSON valid"
=======================response end=================================================
现在,当我使用时:
String result = template.postForObject("http://...", request, String.class)
结果始终包含"\"a string with double quotes, Json valid\""
,而我希望收到它转义的"a string with double quotes, Json valid"
。
我也希望在不解析的情况下收到此答案。
对我来说,这似乎是一个微不足道的问题,但是我在网上没有发现任何SO问题或其他资源。
答案 0 :(得分:0)
似乎指定String.class
会为您提供整个字符串,而不会进行任何反序列化(即使使用了application/json
,即使String实际上是JSON的有效形式也是如此) )。这是因为默认情况下,StringHttpMessageConverter
转换器中已添加了RestTemplate
。
因此,要进行反序列化,我可以使用两种方式:
StringHttpMessageConverter
。使用正确的@JsonCreator
方法使用虚拟的“ holder”类
@AllArgsConstructor
@NoArgsConstructor
public class StringHolder {
@JsonIgnore
private String value;
@JsonCreator
public static StringHolder create(String value){
return new StringHolder(value);
}
}
现在,template.postForObject("http://...", request, StringHolder.class).getValue()
返回了转义的字符串。
答案 1 :(得分:0)
在我的情况下,restfull向我返回了一个JSON矩阵,所以我找到了一个将JSON转换为pojos的页面,这就是我返回的内容
http://pojo.sodhanalibrary.com/
// MyPojo
public class MyPojo
{
private Items[] items;
private First first;
public Items[] getItems ()
{
return items;
}
public void setItems (Items[] items)
{
this.items = items;
}
public First getFirst ()
{
return first;
}
public void setFirst (First first)
{
this.first = first;
}
@Override
public String toString()
{
return "ClassPojo [items = "+items+", first = "+first+"]";
}
}
// CLASE DE FIRST
public class First
{
private String $ref;
public String get$ref ()
{
return $ref;
}
public void set$ref (String $ref)
{
this.$ref = $ref;
}
@Override
public String toString()
{
return "ClassPojo [$ref = "+$ref+"]";
}
}
// CLASE ITEM
public class Items
{
private String nombre_inmueble;
private String inmueble_id;
public String getNombre_inmueble ()
{
return nombre_inmueble;
}
public void setNombre_inmueble (String nombre_inmueble)
{
this.nombre_inmueble = nombre_inmueble;
}
public String getInmueble_id ()
{
return inmueble_id;
}
public void setInmueble_id (String inmueble_id)
{
this.inmueble_id = inmueble_id;
}
@Override
public String toString()
{
return "ClassPojo [nombre_inmueble = "+nombre_inmueble+", inmueble_id = "+inmueble_id+"]";
}
}
// CLASE PRINCIPAL
@SpringBootApplication
public class ApeplazasDropDownApplication {
private static final Logger log = LoggerFactory.getLogger(ApeplazasDropDownApplication.class);
public static void main(String[] args) {
final String urlGETList = "http://localhost/test/getAll";
RestTemplate restTemplate = new RestTemplate();
MyPojo quote = restTemplate.getForObject(urlGETList, MyPojo.class);
log.info(quote.getItems()[1].getInmueble_id());
}
}
// MY API
{
"items": [
{
"inmueble_id": 48,
"nombre_inmueble": "ACAPULCO"
},
{
"inmueble_id": 33,
"nombre_inmueble": "MONTERREY"
},
],
"first":
{
"$ref": "https://localhost/test/getAll"
}
}