1.慎用 RestTemplate.getForObject(url, JSONObject.class)( ps: JSONObject 用的是 fastjson )
接口 http://127.0.0.1:8190/test/mock 对应 controller 层方法代码如下:
@GetMapping( "/mock" )
public String mock(){
return "{\n" +
" \"success\":true,\n" +
" \"message\":\"操作成功!\",\n" +
" \"code\":0,\n" +
" \"result\":{\n" +
" \"realTime\":{\n" +
" \"total\":2324,\n" +
" \"employee\":2300,\n" +
" \"visitor\":24\n" +
" },\n" +
" \"leave\":{\n" +
" \"employee\":100,\n" +
" \"visitor\":5\n" +
" },\n" +
" \"enter\":{\n" +
" \"employee\":1000,\n" +
" \"visitor\":50\n" +
" }\n" +
" },\n" +
" \"timestamp\":1629252023794\n" +
"}";
}
测试代码如下:
@Test
public void test2(){
String url = "http://127.0.0.1:8190/test/mock";
JSONObject json = this.restTemplate.getForObject(url, JSONObject.class);
System.out.println( "替换之前:" + json.toJSONString() );
JSONObject result = json.getJSONObject("result");
JSONObject realTime = result.getJSONObject("realTime");
result.put( "real",realTime );
result.remove( "realTime" );
System.out.println( "替换之后:" + json.toJSONString() );
}
输出:
替换之前:{"result":{"realTime":{"total":2324,"employee":2300,"visitor":24},"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
替换之后:{"result":{"realTime":{"total":2324,"employee":2300,"visitor":24},"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
发现 realTime 属性名没有修改过来,奇了怪了?
但是发现对 接口的返回值先转成字符串,再转成 json对象是可以的:
@Test
public void test2(){
String url = "http://127.0.0.1:8190/test/mock";
JSONObject json = this.restTemplate.getForObject(url, JSONObject.class);
json = JSONObject.parseObject( json.toJSONString() );
System.out.println( "替换之前:" + json.toJSONString() );
JSONObject result = json.getJSONObject("result");
JSONObject realTime = result.getJSONObject("realTime");
result.put( "real",realTime );
result.remove( "realTime" );
System.out.println( "替换之后:" + json.toJSONString() );
}
输出:
替换之前:{"result":{"realTime":{"total":2324,"employee":2300,"visitor":24},"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
替换之后:{"result":{"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50},"real":{"total":2324,"employee":2300,"visitor":24}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
发现 属性名 realTime 已经修改为 real 了。
然后发现如果是使用 restTemplate.getForObject 调用接口时将接收参数类型修改为 String,也是可以的:
@Test
public void test2(){
String url = "http://127.0.0.1:8190/test/mock";
String jsonStr = this.restTemplate.getForObject(url, String.class);
JSONObject json = JSONObject.parseObject(jsonStr);
System.out.println( "替换之前:" + json.toJSONString() );
JSONObject result = json.getJSONObject("result");
JSONObject realTime = result.getJSONObject("realTime");
result.put( "real",realTime );
result.remove( "realTime" );
System.out.println( "替换之后:" + json.toJSONString() );
}
输入如下:
替换之前:{"result":{"realTime":{"total":2324,"employee":2300,"visitor":24},"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
替换之后:{"result":{"leave":{"employee":100,"visitor":5},"enter":{"employee":1000,"visitor":50},"real":{"total":2324,"employee":2300,"visitor":24}},"code":0,"success":true,"message":"操作成功!","timestamp":1629252023794}
发现 realTime已经修改为 real 了。
难道 restTemplate.getForObject(url, JSONObject.class) 这种不能用了吗?请知道的大神指教
