!!! 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 进行处理。
网友评论