目录
业务场景:
MySQL的JSON结构
编辑使用步骤:
1.在数据库设置Json字段
2.建立JAVA实体映射类(Json字段用String结构接收)
3.通过序列化为JSON字符串的方式进行存储(JSON.toJSONString)
4. 通过JSON反序列化获取结果数据
业务场景:
MySQL的JSON存储结构可以满足我的这种需求。
MySQL的JSON结构
MySQL5.7.8 版本以来,MySQL支持原生JSON数据类型。 允许使用原生JSON数据类型比以前MySQL版本中所使用varchar或text文本格式更能有效地存储JSON文档。 MySQL以内部格式存储JSON文档,允许对文档元素的快速读取访问。并且基于JSON结构的键值对存储,可以凭借键值设置更为高效的存储方案以及查询需求。
使用步骤:
1.在数据库设置Json字段
2.建立JAVA实体映射类(Json字段用String结构接收)
@TableName(value = "card_order_info",autoResultMap = true)
@Data
public class CardOrderInfo {
/**
* id
*/
private Long id;
/**
* 用户id
*/
private String userId;
/**
* 名片集合
*/
@TableField(value="card_list",typeHandler = FastjsonTypeHandler.class)
private String cardList;
}
3.通过序列化为JSON字符串的方式进行存储(JSON.toJSONString)
List<String> strings = new ArrayList<>();
strings.add("aaa");
strings.add("cscw");
String jsonString = JSON.toJSONString(strings);
CardOrderInfo cardOrderInfo1 = new CardOrderInfo();
cardOrderInfo1.setCardList(jsonString);
cardOrderInfo1.setUserId("22");
cardOrderInfoMapper.insert(cardOrderInfo1);
4. 通过JSON反序列化获取结果数据
//通过userid获取
CardOrderInfo cardOrderInfo = cardOrderInfoMapper.selectOne(new QueryWrapper<CardOrderInfo>().eq("user_id", cardOrderInfo1.getUserId()));
if (cardOrderInfo==null){return null;}
String cardList = cardOrderInfo.getCardList();
JSONArray objects = JSON.parseArray(cardList);
List<String> cards = JSONObject.parseArray(objects.toJSONString(), String.class);
注意:当你从 MySQL 数据库中使用字符串类型(如 VARCHAR、TEXT)获取 JSON 字段时,MySQL 默认会将特殊字符进行转义,比如双引号
"
, 斜杠\
等。这是为了保证 JSON 数据在字符串类型中的可靠存储,避免解析错误或意外终止字符串。然而,并不是所有的 MySQL 驱动或 ORM 框架都会自动执行反转义操作,这取决于具体的实现方式和配置。有些驱动或框架可能会直接返回包含转义字符的字符串,而有些则会将其进行反转义后再返回给你。为此,我们需要针对不同的情况对得到的Json字符串进行一个处理,才能保证我们能够将其正常反序列化。
解决步骤:
// 通过cardId查询数据
CardInfo cardInfo = cardInfoMapper.selectOne(new QueryWrapper<CardInfo>()
.eq("card_id", cardId));// 此处的Json字符串为“"[\"aa\",\"bb\"]"”
// 除掉json结果的转义字符
String tagsList = cardInfo.getTagsList().replace("\", "");// 为"["aa","bb"]"
String substring = tagsList.substring(1, tagsList.length() - 1);// 为["aa","bb"]
JSONArray objects = JSON.parseArray(substring); // 这样子才能正常转换