gpt4 book ai didi

java - GSON反序列化复杂对象数组

转载 作者:行者123 更新时间:2023-11-30 07:15:06 25 4
gpt4 key购买 nike

我想反序列化一个复杂对象数组

例如我有对象MyTestObject

public class MyTestObject{

String param1;
String param2;
int param3;
}

现在我有一个名为 MyTestObject 的对象数组

我的 json 看起来像这样

{
[
"param1":"something1",
"param2:"something2",
"param3":3
],
[
"param1":"something1",
"param2:"something2",
"param3":3
],
[
"param1":"something1",
"param2:"something2",
"param3":3
]
}

这是我的反序列化代码

public static <T> List<T> fromJSON(String json, Class<T> className) {
GsonBuilder builder = new GsonBuilder();
builder.serializeNulls();
Type myType = new TypeToken<List<T>>() {
}.getType();
Gson g1 = builder.create();
List<T> objects = (List<T>) g1.fromJson(json, (Type) myType);
for (T object : objects) {
Log.d(TAG, "object: " + object + " class " + object.getClass());
}
return objects;
}

ArrayList<MyTestObject> objects = fromJSON(myjson,MyTestObject.class);

数组本身被正确反序列化,但是,其中的对象不属于正确的类,它们属于 com.google.gson.internal.LinkedTreeMap

类型

当我需要它们是 MyTestObject 类型时

我该如何解决这个问题?

最佳答案

示例:

public class Test<T> {
public static void main(String[] args) throws Exception {
new Test<String>().test(String.class);
new Test<Integer>().test(Integer.class);
new Test<Long>().test(Long.class);
}

public void test(Class<T> cls) throws Exception {
TypeToken<?> typeOfT = getGenToken(List.class, cls);
List<?> lst = (List<?>) new Gson().fromJson("[1, 2, 3]", typeOfT.getType());

for (Object o : lst) {
System.out.println("value : " + o + ", type : " + o.getClass());
}
}

static TypeToken<?> getGenToken(final Class<?> raw, final Class<?> gen) throws Exception {
Constructor<ParameterizedTypeImpl> constr = ParameterizedTypeImpl.class.getDeclaredConstructor(Class.class, Type[].class, Type.class);
constr.setAccessible(true);
ParameterizedTypeImpl paramType = constr.newInstance(raw, new Type[] { gen }, null);

return TypeToken.get(paramType);
}
}

ParameterizedTypeImpl 来自 sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl

输出:

value : 1, type : class java.lang.String
value : 2, type : class java.lang.String
value : 3, type : class java.lang.String
value : 1, type : class java.lang.Integer
value : 2, type : class java.lang.Integer
value : 3, type : class java.lang.Integer
value : 1, type : class java.lang.Long
value : 2, type : class java.lang.Long
value : 3, type : class java.lang.Long

注意:事实上我们可以用 T 替换通配符,但这在这里没有用。

关于java - GSON反序列化复杂对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18055041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com