从Json返回空JsonObject的Gson

zu0ti5jz  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(203)

因此,我得到了一个String,它是我在一个类上实现的toJson方法的结果,并且在我的测试代码中确认了它是我的类的正确Json表示。我的目标是将这个String转换为JsonObject,并使用Gson将它传递给一个构造函数。然而,我遇到了一个奇怪的问题。
这是我的暗号

Gson gson = new Gson();
JsonObject jObj = gson.fromJson(jsonString, JsonObject.class);

我以前在我的项目中的很多地方都用过这段完全相同的代码,用于其他类,它运行得很好。我甚至把其中一段函数代码复制到这个测试类中,并进行了尝试。然而,我尝试的每一个版本都得到了同样的结果--jObj是一组空括号。
我不明白这是怎么发生的。我已经确认jsonString有它应该需要的所有字段。为什么Gson返回一个空的JsonObject?没有抛出异常。

klr1opcd

klr1opcd1#

好的,我知道这是一个有点老,但我有同样的问题。解决办法是改变jar文件。我有一个类似的代码样本工作在另一个项目,但后来我遇到了完全相同的问题在另一个项目。嗯,问题是一个旧的gson-2.1.jar。更新了问题的应用程序到匹配的gson-2.3.1.jar和所有的工作。希望这有助于。

bejyjqdl

bejyjqdl2#

从您的注解中得知字符串是{"varName":1, "otherVarName":2, "thirdVarName":3.4},看起来序列化的对象是Map。您可能需要指定类型标记:

gson.fromJson(jsonString, new TypeToken<Map<K,V>>() {}.getType());

其中KV是Map的键类型和值类型。如果不是Map,请指定jsonString的获取来源类。

jm2pwxwz

jm2pwxwz3#

对于我的例子,我不小心在我的dagger模块中使用了下面的初始化器。

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()

我删除了setFieldNamingPolicy,它的工作。

aiazj4mn

aiazj4mn4#

我也有这个问题。
我用的是

return gson.fromJson(response, JsonObject::class.java)

我收到了一个只填充了默认值的对象。
我必须显式定义JsonObject类中每个属性的序列化名称,这与json响应中的命名方式不同。
例如,如果在json中,我解析的字段名是“total_score”,但是我的JsonObject有一个名为“totalProperty”的字段,我必须使用@SerialedName注解来定义关系。

@SerializedName("total_score")
val TotalScore : Int = 0

相关问题