如何将数据库中的Json字段转化为对象返回给前端?

文章的前提是使用了MyBatis-Plus框架,下面的注解都是框架内部的。

今天在网上看了很多教程都没有办法实现这个需求,然后请教了老师终于解决了困扰我一天的难题。需求如下,数据库中的字段是下面这种:

每一个都是JSON类型,然后我要读取这个JSON类型,然后将其以数组的形式返回给前端。JAVA中没有JSON类型,所以接收这个要么用String(返回前端是一大串字符串,剩下让前端处理也行)要么就是用下面的方法将其转化为JSON数组。

1、创建一个类,对应上面数组中每一个对象的属性:

package io.github.talelin.latticy.model;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class SpecKeyValueDO {

    @JsonProperty(value = "key_id")
    private Integer keyId;

    @JsonProperty(value = "value_id")
    private Integer valueId;

    private String value;

    private String key;
}

2、因为上面是一个数组,所以用List<>泛型接收,如果是单纯JSON对象,直接用上面创建的对象接收即可。

1、在属性上打@TableField(typeHandler = JacksonTypeHandler.class)

2、在类上添加 @TableName(value = "sku", autoResultMap = true)让其自动映射

package io.github.talelin.latticy.model;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;

/**
 * sku
 * @author 
 */
@Data
@TableName(value = "sku", autoResultMap = true)  //一定要写好这个 autoResultMap = true
public class SkuDO extends BasePojo implements Serializable {
    private Integer id;
    
    /*省略很多属性*/

    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<SpecKeyValueDO> specs;

}

3、Controller层:

使用这种查询必须使用MyBatis-plus自带的查询方式,即不写SQL语句,因为写SQL语句时还要进行结果映射,所以直接使用条件查询即可。

    @GetMapping("/ids/{id}") //@Positive表示必须是整数
    public List<Sku> getDetails(@PathVariable @Positive Long id) {
        return skuService.lambdaQuery().eq(Sku::getSpuId,id).list();
    }

最终就会返回数组啦:

 否则它的返回值是这样的:

猜你喜欢

转载自blog.csdn.net/weixin_60414376/article/details/127016009