解决java Object转成JSONObject之后,null的字段丢失问题。(包括Object中的类型为List的字段)

不足:为null的字段默认都转成了空字符串""。像有些需求要求字段是数值类型(一般默认值0),没有实现。

依赖:

        <dependency>
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>2.0.23</version>
            </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.13.3</version>
        </dependency>

工具类:

package com.ce.module.hppes.scrap.util;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.util.ArrayList;
import java.util.List;

/**
 * JSONObject中的null转成空字符串
 */
public class JsonNullToEmptyString {
    public static JSONObject convertNullsToEmptyStrings(JSONObject jsonObject) {
        // 创建一个新的JSONObject来存储处理后的结果
        JSONObject result = new JSONObject();

        // 遍历原始JSONObject的每个键值对
        for (String key : jsonObject.keySet()) {
            Object value = jsonObject.get(key);

            // 检查值是否为null
            if (value == null) {
                // 如果是null,则替换为空字符串
                result.put(key, "");
            } else if (value instanceof JSONObject) {
                // 如果值是另一个JSONObject,则递归处理
                result.put(key, convertNullsToEmptyStrings((JSONObject) value));
            } else if (value instanceof JSONArray) {
                // 如果值是JSONArray,则递归处理数组中的每个元素(这里假设数组元素是JSONObject或其他可递归的类型)
                // 注意:这里的处理逻辑可以根据实际需求进行调整,比如仅处理数组中的JSONObject元素
                JSONArray array = new JSONArray();
                for (int i = 0; i < ((JSONArray) value).size(); i++) {
                    Object arrayElement = ((JSONArray) value).get(i);
                    if (arrayElement instanceof JSONObject) {
                        array.add(convertNullsToEmptyStrings((JSONObject) arrayElement));
                    } else {
                        array.add(arrayElement); // 非JSONObject元素保持不变
                    }
                }
                result.put(key, array);
            } else if (value instanceof List) { //如果Object中的某个属性是List类型,转成JSONObject后,该属性仍然是List类型而不是JSONArray
                ObjectMapper mapper = new ObjectMapper();
                // 配置对象映射器以包含null字段
                mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, true);
                try {
                    String json = mapper.writeValueAsString(value);
                    JSONArray array = new JSONArray(); //临时array
                    JSONArray jsonArray = JSONArray.parseArray(json);
                    for (Object arrayElement : jsonArray) {
                        if (arrayElement instanceof JSONObject) {
                            array.add(JsonNullToEmptyString.convertNullsToEmptyStrings((JSONObject) arrayElement));
                        }else {
                            array.add(arrayElement); // 非JSONObject元素保持不变
                        }
                    }
                    result.put(key, array);
                }catch (JsonProcessingException e){
                    e.printStackTrace();
                }
            }
            else {
                // 其他类型的值保持不变
                result.put(key, value);
            }
        }

        return result;
    }
}

Java中,JSONObject是来自org.json库的JSON对象表示形式,而Object是一个泛型概念,可以代表Java中的各种对象类型。要将JSONObject转换成普通Java对象(如Map、List或其他自定义类的对象),你需要进行序列化过程。这通常涉及到两个步骤: 1. **解析JSONJava对象**: 使用JSONObject的`get()`或`opt()`方法获取键对应的值,然后根据数据结构构建相应的Java对象。如果值是简单类型(如String、Number等),可以直接获取;如果是复杂类型(如数组、嵌套对象),则需要递归处理。 ```java import org.json.JSONObject; JSONObject jsonObject = new JSONObject(); // ...填充jsonObject String className = jsonObject.getString("class_name"); Class<?> clazz = MyClass.class; // 假设MyClass是你想要转换的目标类 try { Object obj = clazz.getConstructor(String.class).newInstance(className); JSONObject data = jsonObject.getJSONObject("data"); if (data != null) { // 将data字段转化为目标类对象 Method method = clazz.getMethod("fromJson", JSONObject.class); obj = method.invoke(obj, data); } // 现在obj就是转化后的MyClass对象 } catch (Exception e) { e.printStackTrace(); } ``` 2. **转换复杂对象**: 如果目标对象包含映射(Map)、列表(List)或其他嵌套对象,你可以使用反射API(如`Method`和`Constructor`)创建并填充这些部分。 对于自定义的Java类,可能需要提供`fromJson()`或类似的方法,以便将其从JSONObject转换为该类的实例。 注意:如果你不确定数据的具体结构,你可能需要先编写一些逻辑来遍历整个JSONObject并将其转换为正确的层次结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值