Gson 的 fromJson 方法返回了空的 JsonObject

3
所以我有一个String,它是我在一个类上实现的toJson方法的结果,并且已经在我的测试代码中确认它是我的类的正确Json表示。我的目标是将这个String转换为JsonObject并使用Gson传递给构造函数。然而,我遇到了一个奇怪的问题。
这是我正在调用的代码:
Gson gson = new Gson();
JsonObject jObj = gson.fromJson(jsonString, JsonObject.class);

我之前在项目中的许多地方,对于其他类使用了完全相同的代码片段,并且这些代码都能够正常工作。我甚至将其中一个功能性代码片段复制到了这个测试类中并尝试了一下。然而,无论我尝试哪个版本,结果都是一样的——jObj只是一个空的括号集合。

我不明白这是怎么发生的。我已经确认 jsonString 中具有所有所需的字段。为什么 Gson 返回一个空的 JsonObject?没有任何异常被抛出。


3
当你获取一个空的JsonObject时,jsonString的内容是什么? - Wand Maker
1
它对我有效,我得到了预期的输出。请展示一个小程序来演示问题。 - Alexis C.
1
如果您添加 if (jsonString.trim().isEmpty()) throw new IllegalArgumentException(); 会怎样? - Dici
很难帮助您,因为我们无法重现问题...解析器是严格的还是宽容的?也许字符串包含一些奇怪的不可打印字符。 - Alexis C.
所有字段都是明文字符,具有整数、布尔或双精度值。我没有看到任何奇怪的字符。更重要的是,从项目的其他部分复制代码在这里不再起作用。Gson 中是否有任何东西会受到仅仅在不同目录中实例化的影响? - Michael Hubbard
显示剩余4条评论
4个回答

5

好的,我知道这有点旧了,但我遇到了完全相同的问题。 解决方法是更改jar文件。 我在另一个项目中有类似的代码示例可用,但在另一个项目中却遇到了完全相同的问题。 问题出在较旧的gson-2.1.jar上。 将问题应用程序更新为匹配的gson-2.3.1.jar后,一切正常运作。 希望这可以帮助解决问题。


该死,你真的救了我的命! - Bertie

0
在我的情况下,我无意中在我的Dagger模块中使用了以下的初始化器。
Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()

我移除了 setFieldNamingPolicy,然后它就可以工作了。


0

我也遇到了这个问题。

我正在使用

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

我收到的对象只填充了默认值。

我必须明确地为我的JsonObject类中每个属性定义序列化名称,这与它在json响应中的名称不同。

例如,如果在我解析的json中字段名为“total_score”,但我的JsonObject有一个名为“totalProperty”的字段,我必须使用@SerialedName注释来定义它们之间的关系。

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

0
从您的评论中可以看出,该字符串是{"varName":1, "otherVarName":2, "thirdVarName":3.4},看起来序列化对象是一个Map。您可能需要指定类型令牌:
gson.fromJson(jsonString, new TypeToken<Map<K,V>>() {}.getType());

其中KV是映射的键和值类型。如果它不是一个Map,请指定json字符串所获取的任何类。


@MichaelHubbard:添加了解释,而paulsm4发布的链接详细解释了这一点。 - Chthonic Project
但是 OP 正试图从这个字符串中获取一个 JsonObject,而不是一个 Map - Alexis C.
是的,但据我所知,问题在于将String转换为JsonObject。这个String也可以来自任何其他类,不一定是Map - Alexis C.
@MichaelHubbard 你正在将一个节点转换为字符串,然后再将字符串转换为节点? - Dici
最终发现是依赖问题,不知何故。如果你正在使用Maven,请确保使用版本为2.3.1且范围为“compile”。我建议这样做。 - Michael Hubbard
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接