Java 将JSON数组转成List对象集合

发布时间 2023-11-28 09:55:25作者: 爱学习的疯倾

 一、从对象列表中提取并组装 JSON字段的数据:(工具类)

public class JsonMsgUtils<T> {

    /**
     * 从对象列表中提取并组装 JSON 字段的数据。
     *
     * @param logs             包含对象的列表
     * @param targetClass      目标对象类型,表示 JSON 消息的结构
     * @param jsonMsgFieldName JSON 字段的名称
     * @return 组装后的 JSON 消息数据列表
     */
    public static <T> List<T> extractAndCombineJsonMsg(List<?> logs, Class<T> targetClass, String jsonMsgFieldName) {
        List<T> result = new ArrayList<>();

        for (Object log : logs) {
            try {
                // 使用反射获取jsonMsg字段的值
                Method getterMethod = log.getClass().getMethod("get" + capitalize(jsonMsgFieldName));
                Object jsonMsgValue = getterMethod.invoke(log);

                if (jsonMsgValue != null) {
                    Type jsonMsgListType = TypeToken.getParameterized(List.class, targetClass).getType();
                    List<T> parsedJsonMsgList = new Gson().fromJson(jsonMsgValue.toString(), jsonMsgListType);
                    result.addAll(parsedJsonMsgList);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return result;
    }

    private static String formatLocalDateTime(LocalDateTime localDateTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return localDateTime.format(formatter);
    }

    /**
     * 将字符串的首字母转换为大写。
     *
     * @param str 待转换的字符串
     * @return 转换后的字符串
     */
    private static String capitalize(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        return Character.toUpperCase(str.charAt(0)) + str.substring(1);
    }
}

 

二、封装组装后的 JSON 数据的类(你们可以根据自己的字段定义)

(1)、数据库JSON字段如下:

 (2)、定义组装后的对象:

/**
 * 封装组装后的 JSON 数据的类
 * @author FengQing
 * @program yf-client
 * @description
 * @date 2023/11/25
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AssembledJsonMsg {

    /**
     * 字段名称
     */
    private String fieldName;

    /**
     * 修改后的值
     */
    private String newBean;

    /**
     * 修改前的值
     */
    private String oldBean;

    /**
     * 修改时间
     */
    private String updateTime;

    /**
     * 操作用户名
     */
    private String userName;
}

 

三、在业务处理要组装的数据:调用(extractAndCombineJsonMsg)工具类;

以下是个简单的示例

 /**
     * 根据条件查询操作日志记录列表
     * @param params
     * @return
     */
    @Override
    public List<AssembledJsonMsg> selectChannelLogList(Map<String, Object> params) {
        LambdaQueryWrapper<ChannelLog> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(params.get("channelId") != null, ChannelLog::getChannelId, params.get("channelId"))
        .orderByDesc(ChannelLog::getId);
        List<ChannelLog> list = super.list(wrapper);
        List<AssembledJsonMsg> jsonMsgList = JsonMsgUtils.extractAndCombineJsonMsg(list, AssembledJsonMsg.class, "jsonMsg");
        return jsonMsgList;
    }

 

效果如下:

{
    "code": 0,
    "msg": "操作成功",
    "data": [
        {
            "fieldName": "公司名称",
            "newBean": "测试有限公司",
            "oldBean": "测试有限公司001",
            "updateTime": "2023-11-27 13:47:40",
            "userName": "管理员"
        },
        {
            "fieldName": "分类",
            "newBean": "0,2,1",
            "oldBean": "0,2",
            "updateTime": "2023-11-27 13:47:11",
            "userName": "管理员"
        }
    ]
}