使用fastjson2转换JSON字符串为实体类对象

说明:这个工具类的编写目的是为了将JSON类型的字符串(redis缓存)转换为我项目中的实体类对象以便进行下一步处理。

因为在处理过程中出现了当缓存的时间类型为时间戳时无法转换为我的时间格式,所以进行了一些处理;

如果使用fastJson,可以忽略,fastJson不需要额外进行处理;

代码如下:

package com.tyls.BeanUtil;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.SneakyThrows;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EntityStringUtil {

    /**
     * 将实体类对象转换为字符串
     *
     * @param entity 实体类对象
     * @return 转换后的字符串
     */
    public static String convertEntityToString(Object entity) {
        return JSON.toJSONString(entity);
    }

    /**
     * 转换JSON字符串为实体类对象
     * @param jsonString JSON字符串
     * @param clazz 实体类类型
     * @return
     * @param <T>
     */
    @SneakyThrows
    public static <T> T convertStringToEntity(String jsonString, Class<T> clazz) {
        JSONObject jsonObject = JSONObject.parseObject(jsonString);
        if(jsonObject == null) {
            return null;
        }

        // 遍历实体类的所有字段,查找并处理标注了 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")的日期/时间字段
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if(isEntityClass(field.getType())){
                Object nestedEntity = convertStringToEntity(jsonObject.getString(field.getName()), field.getType());
                // 使用反射将子实体对象设置到当前字段
                jsonObject.put(field.getName(), nestedEntity);
            }else if (field.isAnnotationPresent(JsonFormat.class)) {
                JsonFormat JsonFormat = field.getAnnotation(JsonFormat.class);
                if ("yyyy-MM-dd HH:mm:ss".equals(JsonFormat.pattern())) { // 根据实际格式调整
                    String fieldName = field.getName();
                    if (jsonObject.containsKey(fieldName)) {
                        try {
                            String timestampStr = jsonObject.getString(fieldName);
                            if(StrUtil.isBlank(timestampStr)) continue;
                            long timestampMillis = Long.parseLong(timestampStr);
                            Instant instant = Instant.ofEpochMilli(timestampMillis);
                            LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneOffset.systemDefault());
                            jsonObject.put(fieldName, localDateTime);
                        } catch (Exception e) {
                            // Handle parsing exceptions or log error
                        }
                    }
                }
            }
        }

        // 使用已更新的 JSONObject 转换为实体类
        T entity = JSON.parseObject(jsonObject.toJSONString(), clazz);
        //convertDateTimeFields(entity);
        return entity;
    }

    /**
     * 判断是否为实体类
     * @param clazz
     * @return
     */
    private static boolean isEntityClass(Class<?> clazz) {
        // 根据实际情况判断一个类是否为实体类
        // 以下仅作为示例,您可以根据实际项目需求调整判断条件
        return !Arrays.asList(
                String.class,
                Integer.class,
                Long.class,
                Double.class,
                Float.class,
                Boolean.class,
                Enum.class,
                BigDecimal.class,
                LocalDateTime.class,
                LocalDate.class
        ).contains(clazz) && !clazz.isPrimitive();
    }


    /**
     * 将字符串转换为实体类对象列表
     *
     * @param jsonString 字符串
     * @param clazz      实体类的Class对象
     * @param <T>        实体类的类型
     * @return 转换后的实体类对象列表
     */
    public static <T> List<T> convertStrToEntityList(String jsonString, Class<T> clazz) {
        if (jsonString == null || jsonString.isEmpty())
            return null;
        List<T> list = new ArrayList<>();
        JSONArray jsonStrArray = JSON.parseArray(jsonString);
        for (Object jsonObject : jsonStrArray) {
            T jsonModel = JSONObject.parseObject(jsonObject.toString(), clazz);
            list.add(jsonModel);
        }

        return list;

    }

    /**
     * 将字符串列表转换为实体类集合
     *
     * @param jsonList 字符串列表
     * @param clazz    实体类的Class对象
     * @param <T>      实体类的类型
     * @return 转换后的实体类集合
     */
    public static <T> List<T> convertStrListToEntList(List<String> jsonList, Class<T> clazz) {
        List<T> entityList = new ArrayList<>();
        for (String jsonString : jsonList) {
            T entity = convertStringToEntity(jsonString, clazz);
            entityList.add(entity);
        }
        return entityList;
    }


    private static final String DATE_TIME_PATTERN = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d{3}";


    /**
     * 检查字段类型是否为  LocalDateTime ,如果是字符串类型并匹配了日期时间模式,则将其转换为  LocalDateTime  对象。
     *
     * @param entity
     */
    private static void convertDateTimeFields(Object entity) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        Pattern pattern = Pattern.compile(DATE_TIME_PATTERN);

        Class<?> clazz = entity.getClass();
        for (java.lang.reflect.Field field : clazz.getDeclaredFields()) {
            if (field.getType().equals(LocalDateTime.class)) {
                field.setAccessible(true);
                try {
                    Object value = field.get(entity);
                    if (value instanceof String) {
                        String dateTimeString = (String) value;
                        Matcher matcher = pattern.matcher(dateTimeString);
                        if (matcher.find()) {
                            LocalDateTime dateTime = LocalDateTime.parse(matcher.group(), formatter);
                            field.set(entity, dateTime);
                        }
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }



}

我的项目中,所有需要处理的时间均被

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

注解所覆盖,故此没有做其他的适配,使用时可以根据自己的项目情况分析判断,更改匹配逻辑。

菜鸟思路创解,如有更好的思路或认为改代码有错误,欢迎评论指正。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要将JSON字符串转换实体对象,可以使用JSON库提供的方法来实现。你可以先将JSON字符串转换JSON对象,然后使用JSON对象提供的方法来获取和设置实体对象的属性。 首先,你需要导入JSON库,比如FastJSON或者Gson。然后,你可以按照以下步骤进行操作: 1. 将JSON字符串转换JSON对象。根据引用中的代码示例,你可以使用JSON库提供的`JSONObject.parseObject()`方法将JSON字符串转换JSON对象。 ```java String jsonStr = "{\"test\":\"test\",\"Result\":[{\"Detail1\":\"Detail1\",\"Result1\":\"Result1\"},{\"Detail2\":\"Detail2\",\"Result2\":\"Result2\"},{\"Detail3\":\"Detail3\",\"Result3\":\"Result3\"}]}"; JSONObject jsonObject = JSONObject.parseObject(jsonStr); ``` 2. 创建实体类对象。你需要根据实体类的定义,创建一个对应的Java对象。 例如,假设你的实体类是`MyEntity`,包含属性`test`和`result`,那么你可以在代码中创建一个`MyEntity`对象。 ```java MyEntity myEntity = new MyEntity(); ``` 3. 从JSON对象中获取属性值并设置给实体对象。根据引用中的代码示例,你可以使用JSON对象提供的`getString()`等方法来获取属性值,并将其设置给实体对象的对应属性。 ```java String testStr = jsonObject.getString("test"); myEntity.setTest(testStr); ``` 最后,你就得到了一个包含从JSON字符串转换而来的实体对象`myEntity`。 需要注意的是,你需要根据你的实际情况来定义实体类以及设置属性的方式,这里只是一个示例。另外,使用JSON库和具体的实体类定义可能会有所不同,所以请参考你所使用JSON库的文档来获得更详细的信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [将json字符串实体类互相转换](https://blog.csdn.net/weixin_45583303/article/details/127192075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [JSON字符串JSON对象相互转化实例详解](https://download.csdn.net/download/weixin_38614484/13205956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值