結論:解決VO類屬性與要返回的json串欄位名稱不一樣的問題,需要用到@JsonProperty(「xxx」)這個註解
那具體怎麼使用呢?下面我拿我個人的例子來說明。
{
"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類屬性,也能達到見名知意效果。
/**
* 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;
}
/**
* 商品(包含類目)
* 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;
}
/**
* 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;
}
(這邊只是返回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串格式)