|
|
|
@ -0,0 +1,104 @@
|
|
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* https://www.mall4j.com/
|
|
|
|
|
*
|
|
|
|
|
* 未经允许,不可做商业用途!
|
|
|
|
|
*
|
|
|
|
|
* 版权所有,侵权必究!
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package com.yami.shop.common.serializer.json;
|
|
|
|
|
|
|
|
|
|
// 导入Hutool工具库中用于字符串操作的工具类,例如判断字符串是否为空、处理字符串拼接等操作
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
// 导入Jackson库中用于自定义JSON序列化相关的核心类,用于定义如何将Java对象序列化为JSON格式
|
|
|
|
|
import com.fasterxml.jackson.core.JsonGenerator;
|
|
|
|
|
import com.fasterxml.jackson.databind.JsonSerializer;
|
|
|
|
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
|
|
|
|
// 导入自定义的类,Qiniu类可能包含了七牛云相关的配置信息,如资源访问地址等
|
|
|
|
|
import com.yami.shop.common.bean.Qiniu;
|
|
|
|
|
// 导入自定义的图片上传工具类,可能用于获取图片上传相关的配置信息,比如上传类型、资源地址等
|
|
|
|
|
import com.yami.shop.common.util.ImgUploadUtil;
|
|
|
|
|
// 导入Spring框架用于实现依赖注入的注解以及将类标记为组件的注解,表明该类是受Spring管理的组件,可被自动注入到需要的地方
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
import java.util.regex.Matcher;
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* ImgJsonSerializer类是一个自定义的JSON序列化器,用于处理将特定格式的字符串(可能是图片相关的路径字符串)序列化为JSON格式时的逻辑定制。
|
|
|
|
|
* 它主要根据图片上传的类型以及图片路径本身的格式(是否以http或https开头),来对图片路径进行处理,添加相应的资源访问地址前缀,
|
|
|
|
|
* 最终将处理后的图片路径以合适的格式序列化为JSON字符串输出,适用于在将包含图片路径信息的对象转换为JSON时进行特定的路径格式调整需求。
|
|
|
|
|
*
|
|
|
|
|
* @author lanhai
|
|
|
|
|
*/
|
|
|
|
|
@Component
|
|
|
|
|
public class ImgJsonSerializer extends JsonSerializer<String> {
|
|
|
|
|
|
|
|
|
|
// 通过Spring的依赖注入机制,注入一个Qiniu对象,该对象可能包含了七牛云存储相关的配置信息,比如七牛云资源的访问地址等
|
|
|
|
|
@Autowired
|
|
|
|
|
private Qiniu qiniu;
|
|
|
|
|
// 注入一个ImgUploadUtil对象,用于获取图片上传相关的配置信息,例如图片上传类型等,辅助对图片路径进行处理
|
|
|
|
|
@Autowired
|
|
|
|
|
private ImgUploadUtil imgUploadUtil;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 重写了Jackson库中的serialize方法,用于定义具体的序列化逻辑,也就是将传入的字符串(此处假设与图片路径相关)按照特定规则转换为JSON格式的字符串输出。
|
|
|
|
|
*
|
|
|
|
|
* @param value 要进行序列化的字符串,在这里可能表示图片的路径信息,可能是单个图片路径或者多个图片路径用逗号分隔的形式
|
|
|
|
|
* @param gen Jackson库中的JsonGenerator对象,用于生成JSON输出内容,通过它可以将处理后的字符串写入到最终的JSON输出中
|
|
|
|
|
* @param serializers Jackson库中的SerializerProvider对象,提供了序列化相关的上下文信息,比如配置等,但在这个方法中通常不需要直接操作它
|
|
|
|
|
* @throws IOException 如果在向JsonGenerator写入内容过程中出现I/O异常,会抛出此异常,需要上层调用者进行相应处理
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
|
|
|
|
|
// 判断传入的要序列化的字符串是否为空(空白字符串,包括null、空字符串以及只包含空格等不可见字符的字符串)
|
|
|
|
|
if (StrUtil.isBlank(value)) {
|
|
|
|
|
// 如果为空,则向JsonGenerator写入一个空字符串,保持JSON格式的一致性,然后直接返回,不再进行后续处理
|
|
|
|
|
gen.writeString(StrUtil.EMPTY);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 将传入的字符串按照逗号进行分割,得到一个字符串数组,假设这里的字符串表示多个图片路径,以逗号分隔开,每个元素就是一个单独的图片路径
|
|
|
|
|
String[] imgs = value.split(StrUtil.COMMA);
|
|
|
|
|
// 创建一个可变的字符串构建器,用于拼接处理后的图片路径,方便后续构建最终的序列化字符串
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
|
// 用于存储资源访问地址,根据不同的上传类型来确定具体的值,后续会将其添加到图片路径前面(如果图片路径本身不符合要求的话)
|
|
|
|
|
String resourceUrl = "";
|
|
|
|
|
// 定义一个正则表达式字符串,用于匹配以"http"或"https"开头的字符串,目的是判断图片路径是否已经是完整的网络访问地址形式
|
|
|
|
|
String rule = "^((http[s]{0,1})://)";
|
|
|
|
|
// 使用定义好的正则表达式创建一个Pattern对象,用于后续进行正则匹配操作
|
|
|
|
|
Pattern pattern = Pattern.compile(rule);
|
|
|
|
|
|
|
|
|
|
// 根据ImgUploadUtil对象获取的上传类型来确定资源访问地址(resourceUrl)的值
|
|
|
|
|
if (Objects.equals(imgUploadUtil.getUploadType(), 2)) {
|
|
|
|
|
// 如果上传类型为2,从注入的Qiniu对象中获取资源访问地址,可能是七牛云存储资源的访问地址,用于构建完整的图片访问路径
|
|
|
|
|
resourceUrl = qiniu.getResourcesUrl();
|
|
|
|
|
} else if (Objects.equals(imgUploadUtil.getUploadType(), 1)) {
|
|
|
|
|
// 如果上传类型为1,从ImgUploadUtil对象中获取资源访问地址,可能是其他存储方式对应的资源访问地址
|
|
|
|
|
resourceUrl = imgUploadUtil.getResourceUrl();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 遍历分割后的每个图片路径字符串
|
|
|
|
|
for (String img : imgs) {
|
|
|
|
|
// 使用创建的Pattern对象对当前图片路径字符串进行正则匹配,得到一个Matcher对象,用于查看是否匹配成功
|
|
|
|
|
Matcher matcher = pattern.matcher(img);
|
|
|
|
|
// 如果匹配成功,说明图片路径已经是以"http"或"https"开头的完整网络访问地址形式,直接将其添加到字符串构建器中,并添加逗号(保持与传入格式的一致性,后续会处理末尾多余的逗号)
|
|
|
|
|
if (matcher.find()) {
|
|
|
|
|
sb.append(img).append(StrUtil.COMMA);
|
|
|
|
|
} else {
|
|
|
|
|
// 如果图片路径不是完整的网络访问地址形式,则将前面确定的资源访问地址(resourceUrl)、当前图片路径以及逗号依次添加到字符串构建器中,构建完整的图片访问路径格式
|
|
|
|
|
sb.append(resourceUrl).append(img).append(StrUtil.COMMA);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除字符串构建器中最后一个字符(末尾多余的逗号),得到最终处理好的图片路径字符串
|
|
|
|
|
sb.deleteCharAt(sb.length() - 1);
|
|
|
|
|
// 将处理好的图片路径字符串通过JsonGenerator写入到最终的JSON输出中,完成序列化操作
|
|
|
|
|
gen.writeString(sb.toString());
|
|
|
|
|
}
|
|
|
|
|
}
|