1.接口發送json格式的數據
{
"code": 1,
"message": "成功",
"rows": [
{
"latitude": "40.05068",
"longitude": "116.305506",
"placeName": "中國北京市海淀區軟件園六號路",
"createTime": 1576132004000
}
],
"pageNumber": 1,
"pageSize": 15,
"total": 1,
"pageCount": 1
}
2.創建Java對象與Json數據相對應上,可以使用GsonFormat插件把Json對象轉爲Java對象。
package com.hengke.project.data.api.domain;
import com.hengke.project.data.result.PageOutputDTO;
import lombok.Data;
import org.apache.poi.ss.formula.functions.T;
import java.util.List;
/**
* @Author :Guo Shi Lin
* @date : 2019/12/17 16:11
* @description:設備軌跡返回實體類
* @modified By:
* @version: 1.0
*/
@Data
public class ApiResult<T> extends PageOutputDTO {
/**
* result : {"code":1,"message":"成功","rows":[{"latitude":"40.05068","longitude":"116.305506","placeName":"中國北京市海淀區軟件園六號路","createTime":1576132004000}],"pageNumber":1,"pageSize":15,"total":1,"pageCount":1}
*/
/* private ResultBean result;
@Data*/
/*public static class ResultBean<T> extends PageOutputDTO {*/
/**
* code : 1
* message : 成功
* rows : [{"latitude":"40.05068","longitude":"116.305506","placeName":"中國北京市海淀區軟件園六號路","createTime":1576132004000}]
* pageNumber : 1
* pageSize : 15
* total : 1
* pageCount : 1
*/
private int code;
private String message;
private List<T> rows;
@Data
public static class RowsBean {
/**
* latitude : 40.05068
* longitude : 116.305506
* placeName : 中國北京市海淀區軟件園六號路
* createTime : 1576132004000
*/
private String latitude;
private String longitude;
private String placeName;
private long createTime;
}
/*}*/
}
3.寫個測試類測試一下
@Test
public void test1(){
String message = "{\n" +
" \"code\": 1,\n" +
" \"message\": \"成功\",\n" +
" \"rows\": [\n" +
" {\n" +
" \"latitude\": \"40.05068\",\n" +
" \"longitude\": \"116.305506\",\n" +
" \"placeName\": \"中國北京市海淀區軟件園六號路\",\n" +
" \"createTime\": 1576132004000\n" +
" }\n" +
" ],\n" +
" \"pageNumber\": 1,\n" +
" \"pageSize\": 15,\n" +
" \"total\": 1,\n" +
" \"pageCount\": 1\n" +
" }";
// ApiResult<DeviceTrailOutputDTO> apiLocaltionResult = JSON.parseObject(message, new TypeReference<ApiResult<DeviceTrailOutputDTO>>(){});
ApiResult<DeviceTrailOutputDTO> apiLocaltionResult = JSON.parseObject(message, ApiResult.class);
List<DeviceTrailOutputDTO> rowsBeanList = apiLocaltionResult.getRows();
rowsBeanList.forEach(deviceTrailOutputDTO -> {
System.out.println(deviceTrailOutputDTO);
System.out.println(deviceTrailOutputDTO.getPlaceName());
});
}
上面測試報錯,錯誤信息如下:
java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.hengke.project.data.result.DeviceTrailOutputDTO
at java.util.ArrayList.forEach(ArrayList.java:1257)
at com.hengke.project.data.api.service.JsomTest.test1(JsomTest.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
從上面的錯誤信息能看出來是因爲JsonObect不能轉爲Java對象,然後上網查找文檔,找到了解決的辦法,用TypeReference來轉就行了,代碼如下:
@Test
public void test1(){
String message = "{\n" +
" \"code\": 1,\n" +
" \"message\": \"成功\",\n" +
" \"rows\": [\n" +
" {\n" +
" \"latitude\": \"40.05068\",\n" +
" \"longitude\": \"116.305506\",\n" +
" \"placeName\": \"中國北京市海淀區軟件園六號路\",\n" +
" \"createTime\": 1576132004000\n" +
" }\n" +
" ],\n" +
" \"pageNumber\": 1,\n" +
" \"pageSize\": 15,\n" +
" \"total\": 1,\n" +
" \"pageCount\": 1\n" +
" }";
ApiResult<DeviceTrailOutputDTO> apiLocaltionResult = JSON.parseObject(message, new TypeReference<ApiResult<DeviceTrailOutputDTO>>(){});
// ApiResult<DeviceTrailOutputDTO> apiLocaltionResult = JSON.parseObject(message, ApiResult.class);
List<DeviceTrailOutputDTO> rowsBeanList = apiLocaltionResult.getRows();
rowsBeanList.forEach(deviceTrailOutputDTO -> {
System.out.println(deviceTrailOutputDTO);
System.out.println(deviceTrailOutputDTO.getPlaceName());
});
}
輸出信息: