如何将 LinkedTreeMap 转换为 gson JsonObject

Posted

技术标签:

【中文标题】如何将 LinkedTreeMap 转换为 gson JsonObject【英文标题】:How do I convert a LinkedTreeMap to gson JsonObject 【发布时间】:2016-10-29 15:46:25 【问题描述】:

对于 java 数据处理程序,我发送格式正确的 JSON,但是结合了 Spring、Java 决定如何转换它所看到的内容,以及我真的不应该去改变那个 JSON 以便一旦我能看到它的框架,它变成了一个LinkedTreeMap,我需要把它转换成一个JsonObject。 这不是将 JSON 序列化/反序列化为 java 对象,它的“最终形式”是一个 gson JsonObject,它需要能够处理任何有效的 JSON。


"key":"value",
"object": 
    "array":[
        "value1", 
        "please work"
        ]
    

是我一直在使用的示例,一旦我看到它,它就是一个 .toString() 到的 LinkedTreeMap

key=value, object=array=[value1, please work]

您可以将“=”替换为“:”,但没有用于

的内部引号
new JsonParser().parse(gson.toJson(STRING)).getAsJsonObject()

策略。

有没有更直接的方法可以将 LinkedTreeMap 转换为 JsonObject,或者有一个库可以将内部引号添加到字符串中,或​​者甚至有一种方法可以将一个字符串转换为不需要内部引号的 JsonObject?

【问题讨论】:

可能相关:***.com/questions/22285661/… 我不明白。您是否希望获得String?然后只需 toJson 传入 LinkedTreeMap 我正在寻找通过钩子或骗子获得 JsonObject,没有找到任何直接从 LinkedTreeMap 到 JsonObject 的方法,我已经开始研究字符串操作,因为有一个正确的方法获取转换为 JsonObject 的字符串。 您是如何获得LinkedTreeMap 的?直接反序列化到JsonObject即可。 LinkedTreeMap 是我从“Spring、Java 决定如何转换它所看到的内容以及我真的不应该改变的框架的组合”中得到的。我第一次可以访问它的数据已经是LinkedTreeMap了,如果可以直接将LinkedTreeMap反序列化为JsonObject,那就是问题的答案了。 【参考方案1】:

您通常必须将对象序列化为 JSON,然后将该 JSON 解析回JsonObject。幸运的是,Gson 提供了一种可以跳过解析的toJsonTree 方法。

LinkedTreeMap<?,?> yourMap = ...;
JsonObject jsonObject = gson.toJsonTree(yourMap).getAsJsonObject();

请注意,如果可以,只需将 JSON 直接反序列化为 JsonObject 即可

gson.fromJson(theJson, JsonObject.class);

【讨论】:

以上是关于如何将 LinkedTreeMap 转换为 gson JsonObject的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 ClassName

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 java.util.LinkedHashMap

GSON源码LinkedTreeMap学习

为啥 Retrofit & Gson 返回 LinkedTreeMap 列表而不是我预期的类型?

ProGuard 让 Gson 返回 LinkedTreeMap 而不是我的类型

一文吃透Json解析工具类合集(FastJsonJacksonGson)