RestTemplate消耗Json字符串

时间:2018-08-06 09:56:11

标签: java resttemplate

我正在尝试使用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问题或其他资源。

2 个答案:

答案 0 :(得分:0)

似乎指定String.class会为您提供整个字符串,而不会进行任何反序列化(即使使用了application/json,即使String实际上是JSON的有效形式也是如此) )。这是因为默认情况下,StringHttpMessageConverter转换器中已添加了RestTemplate

因此,要进行反序列化,我可以使用两种方式:

  • 从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"

          }

}