gpt4 book ai didi

android - Gson 中的 RuntimeException 解析 JSON : Failed to invoke protected java. lang.ClassLoader() with no args

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:10:45 47 4
gpt4 key购买 nike

我继承了一些使用 Gson 将我们的应用程序状态保存为 JSON 的代码,然后使用 fromJson 读取它.

Gson gson = createGson();
gson.fromJson(objString, myClass);

正在保存的字段之一是 Location .不幸的是,有时解析保存的数据会失败,因为我保存的位置在其 mExtras 中包含一个 mClassLoader,而 Gson 库无法创建类加载器并出现此错误:

RuntimeException: Failed to invoke protected java.lang.ClassLoader() with no args

有谁知道为什么 ClassLoader 被包含在我的 Location 的 extras 中,以及它是否应该以 JSON 表示形式结束?

我假设我可以通过单独保存 Location 对象的关键字段(例如经度、纬度、高度、时间、精度)来解决这个问题,但如果可能的话最好保存 Location 对象。

我看到有一个 ExclusionStrategy对象我可以用来排除字段,但我不确定我是否可以/应该使用它来从我的位置中排除额外内容...

仅供引用,这是我的 Location 对象的 JSON 数据(更改了经度和纬度以隐藏我):

{
<snip>
"lastKnownLocation": {
"mResults": [
0,
0
],
"mProvider": "gps",
"mExtras": {
"mParcelledData": {
"mOwnObject": 1,
"mObject": 5525040
},
"mClassLoader": {
"packages": {}
},
"mMap": {},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
},
"mDistance": 0,
"mTime": 1354658984849,
"mAltitude": 5.199999809265137,
"mLongitude": -122.4376,
"mLon2": 0,
"mLon1": 0,
"mLatitude": 37.7577,
"mLat1": 0,
"mLat2": 0,
"mInitialBearing": 0,
"mHasSpeed": true,
"mHasBearing": false,
"mHasAltitude": true,
"mHasAccuracy": true,
"mAccuracy": 16,
"mSpeed": 0,
"mBearing": 0
},
<snip>
}

下面是代码未崩溃时 mExtras 包含的示例:

"mExtras": {
"mParcelledData": {
"mOwnsNativeParcelObject": true,
"mNativePtr": 1544474480
},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
}

最佳答案

问题是您试图直接将系统提供的类 (Location) 转换为 JSON。而且,如您所见,您会遇到序列化内部状态/Java 特定事物的问题。 JSON 是一种半通用的信息传递方式。

您不能轻易使用@Expose 注释,因为它不是您的类;这将需要修改 Location 的源代码,或者通过相当广泛的过程在运行时使用 jassist 添加它们(参见:http://ayoubelabbassi.blogspot.com/2011/01/how-to-add-annotations-at-runtime-to.html)

查看 Location 类,我将简单地创建一个自定义 Gson Serializer 和 Deserializer 并完成它。您真正感兴趣的是 GPS 数据,而不是类本身的内部结构。您只需使用 getter 在序列化器中构建包含所需信息的 JSON,然后在 Deserializer 中创建 Location 的新实例,并使用公共(public) setter 将提供的 JSON 中的信息填充到该实例中。

class LocationSerializer implements JsonSerializer<Location>
{
public JsonElement serialize(Location t, Type type,
JsonSerializationContext jsc)
{
JsonObject jo = new JsonObject();
jo.addProperty("mProvider", t.getProvider());
jo.addProperty("mAccuracy", t.getAccuracy());
// etc for all the publicly available getters
// for the information you're interested in
// ...
return jo;
}

}

class LocationDeserializer implements JsonDeserializer<Location>
{
public Location deserialize(JsonElement je, Type type,
JsonDeserializationContext jdc)
throws JsonParseException
{
JsonObject jo = je.getAsJsonObject();
Location l = new Location(jo.getAsJsonPrimitive("mProvider").getAsString());
l.setAccuracy(jo.getAsJsonPrimitive("mAccuracy").getAsFloat());
// etc, getting and setting all the data
return l;
}
}

现在在您的代码中使用 GsonBuilder 并注册类:

...
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Location.class, new LocationDeserializer());
gsonBuilder.registerTypeAdapter(Location.class, new LocationSerializer());
Gson gson = gsonBuilder.create();
...

这应该能很好地处理它。

关于android - Gson 中的 RuntimeException 解析 JSON : Failed to invoke protected java. lang.ClassLoader() with no args,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13944346/

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