Java之fastjson的簡單使用

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());
        });
    }

輸出信息:

發佈了70 篇原創文章 · 獲贊 17 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章