解決VO類屬性與要返回的json串欄位名稱不一樣的問題

2020-10-22 11:00:30

結論:解決VO類屬性與要返回的json串欄位名稱不一樣的問題,需要用到@JsonProperty(「xxx」)這個註解

那具體怎麼使用呢?下面我拿我個人的例子來說明。

需要返回的json串欄位格式如下:

在這裡插入圖片描述

{
    "code": 0,
    "msg": "成功",
    "data": [
        {
            "name": "熱榜",
            "type": 1,
            "foods": [
                {
                    "id": "123456",
                    "name": "皮蛋粥",
                    "price": 1.2,
                    "description": "好吃的皮蛋粥",
                    "icon": "http://xxx.com",
                }
            ]
        }

但可以明顯看到,有兩個名稱一樣的name欄位。會讓人容易混淆。

所以在VO類,我們具體的來寫,如:categoryName,productNam。這樣寫,就可以達到見名知意的效果。

那麼問題來了,你這樣寫VO類的屬性,返回的json串欄位,也會是categoryName,productNam。

這樣就會與我們想要返回的兩個name欄位不一致。

那麼在不改json串兩個name名稱的情況下,如何達到categotyName在轉json的串的時候是name呢?

這就要用到@JsonProperty("name")

案例解決方法

在VO類的categoryName屬性上面加上@JsonProperty("name")註解。

這樣做,就會將VO類的categoryName屬性在轉json串的時候,欄位名稱不會是CategotyName,而是註解中的name。

這樣,會與要求返回的name是一樣的了,前端可以接收到相應的資料,而VO類屬性,也能達到見名知意效果。

具體程式碼

ProductInfoVO

/**
 * Created by 李柏霖
 * 2020/10/17 21:20
 */

package com.lbl.VO;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.math.BigDecimal;

@Data
public class ProductInfoVO {

    @JsonProperty("id")
    private String productiId;
    @JsonProperty("name")
    private String productnName;
    @JsonProperty("price")
    private BigDecimal productPrice;
    @JsonProperty("description")
    private String productDescription;
    @JsonProperty("icon")
    private String productIcon;
}

ProductVO

/**
 * 商品(包含類目)
 * Created by 李柏霖
 * 2020/10/17 21:12
 */

package com.lbl.VO;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;

@Data
public class ProductVO {

    @JsonProperty("name")
    private String categoryName;

    @JsonProperty("type")
    private Integer categoryType;

    @JsonProperty("foods")
    private List<ProductInfoVO> productInfoVOList;
}

ResultVO

/**
 * http請求返回的最外層物件
 * Created by 李柏霖
 * 2020/10/17 20:45
 */

package com.lbl.VO;

import lombok.Data;

@Data
public class ResultVO<T> {

    //錯誤碼
    private Integer code;
    //提示資訊
    private String msg;
    //返回的具體內容
    private T data;
}

BuyerProductController

(這邊只是返回json欄位名,並沒有加真實資料,單純為了驗證json串格式)

/**
 * 買家商品
 * Created by 李柏霖
 * 2020/10/17 20:11
 */

package com.lbl.controller;

import com.lbl.VO.ProductInfoVO;
import com.lbl.VO.ProductVO;
import com.lbl.VO.ResultVO;
import com.lbl.dataObject.ProductCategory;
import com.lbl.dataObject.ProductInfo;
import com.lbl.service.ICategoryService;
import com.lbl.service.IProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/buyer/product")
public class BuyerProductController {

    @Autowired
    IProductService productService;

    @Autowired
    ICategoryService categoryService;

    @GetMapping("/list")
    public ResultVO list(){
        //1.查詢所有的上架商品
        List<ProductInfo> productInfoList = productService.findUpAll();
        //2.查詢類目(一次性查詢)
        List<ProductCategory> categoryList = new ArrayList<>();

        //3.資料拼裝


        //最外層(1層)
        ResultVO<Object> resultVO = new ResultVO<>();
        resultVO.setCode(0);
        resultVO.setMsg("成功");
        //類目層(2層)
        ProductVO productVO = new ProductVO();
        //商品詳情層(3層)
        List<ProductInfoVO> productInfoVOList=new ArrayList<>();
        ProductInfoVO productInfoVO = new ProductInfoVO();
        productInfoVOList.add(productInfoVO);




        //在1層拼接2層
        resultVO.setData(productVO);
        //在類(在2層拼接3層)
        productVO.setProductInfoVOList(productInfoVOList);
        return resultVO;
    }
}

頁面效果:

(這邊只是返回json欄位名,並沒有加真實資料,單純為了驗證json串格式)

在這裡插入圖片描述