美文网首页
gson 转化结果为null的坑

gson 转化结果为null的坑

作者: 风___________ | 来源:发表于2023-09-14 18:29 被阅读0次

!!! Gson 匿名类 =》 jsonString的 时候返回是 "null"

~~ 最初代码如下:

HasMap parameters = new  HashMap(){{
  put("datas",new ArrayList(){{
        add("13");
        add("123");
        add("1233");
  }});
}}
String v = (new Gson()).toJson(parameters); // 输出为"null"

修复后

HasMap parameters =  new  HashMap();
List datas = new ArrayList();
parameters.put("datas", datas);
datas.add("13");
datas.add("123");
datas.add("1233");

String v = (new Gson()).toJson(parameters); // 输出为 正常的json了

结论: 好坑啊~. GSON 类 转 JSON,不能使用匿名类~

gpt提供的解决方案 || ————————不好使~————————

当使用 Gson 将匿名子类的 HashMap 转换为 JSON 字符串时,可能会遇到返回 "null" 的情况。这是由于匿名子类默认不会被 Gson 正确处理。为了解决这个问题,你可以使用 Gson 的 registerTypeAdapter() 方法来注册一个自定义的 TypeAdapter,以处理匿名子类的转换。

下面是一个示例代码:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonIOException;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

import java.lang.reflect.Type;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        // 创建 Gson 对象,并注册自定义的 TypeAdapter
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(HashMap.class, new HashMapTypeAdapter())
                .create();

        // 创建匿名子类的 HashMap 对象
        HashMap<String, String> hashMap = new HashMap<String, String>() {{
            put("key1", "value1");
            put("key2", "value2");
        }};

        // 将对象转换为 JSON 字符串
        String jsonString = gson.toJson(hashMap);

        // 打印转换结果
        System.out.println(jsonString);
    }

    // 自定义的 TypeAdapter 用于处理匿名子类的转换
    static class HashMapTypeAdapter implements JsonSerializer<HashMap<?, ?>> {
        @Override
        public JsonElement serialize(HashMap<?, ?> src, Type typeOfSrc, JsonSerializationContext context) {
            JsonObject jsonObject = new JsonObject();
            for (HashMap.Entry<?, ?> entry : src.entrySet()) {
                jsonObject.addProperty(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
            }
            return jsonObject;
        }
    }
}

在上面的示例中,我们创建了一个自定义的 TypeAdapter HashMapTypeAdapter,用于处理匿名子类的转换。在 serialize() 方法中,我们将匿名子类的 HashMap 转换为 JsonObject,并手动处理键值对的转换。然后,我们使用 registerTypeAdapter() 方法将自定义的 TypeAdapter 注册到 Gson 中。

通过这种方式,我们可以确保匿名子类的 HashMap 在转换为 JSON 字符串时不返回 "null",而是按照我们自定义的方式进行转换。

请注意,这个示例只处理了匿名子类的 HashMap 转换,如果你有其他类型的匿名子类需要转换,你可以根据需要创建相应的 TypeAdapter 进行处理。

相关文章

网友评论

      本文标题:gson 转化结果为null的坑

      本文链接:https://www.haomeiwen.com/subject/yfomvdtx.html