将JSON反序列化为未知类型的集合
我正在用Java编写一个程序,通过调用某些方法向外部API发出请求。 这些方法中的每一个都返回不同的JSON结构,它还取决于传递的参数。 我的问题是,是否有一些方法可以使用Gson反序列化响应字符串,而无需为每个方法编写不同的类。
如果不是Gson,我可以使用哪个其他库?
谢谢。
我的问题是,是否有一些方法可以使用Gson反序列化响应字符串,而无需为每个方法编写不同的类。
就在这里。 如果您不关心反序列化为特定Java类型的JSON结构只是一个包含键值对的对象,其中所有值都是JSON基元,那么可以将结构简单地反序列化为Map
。
请注意, Map
不起作用,因为它没有为Gson提供足够的类型信息来反序列化。 Gson只为每个值创建普通的Object
实例 – 不是String
或Integer
实例,而只是普通的Object
实例。 JSON中的实际值不会反序列化。 从表面上看,可以增强Gson以为JsonPrimitive
值创建更多特定于类型的实例,这似乎是合理的。 例如,既然可以通过调用isBoolean()
来确定JsonPrimitive
是否是Boolean
,那么人们可能希望Gson只构造一个Boolean
,但它不会–Gson只是创建一个空的并且可能没用Object
。
这是一个certificate这一点的例子。
input.json内容:
{ "one":"won", "too":22, "3":false }
Foo.java:
import java.io.FileReader; import java.lang.reflect.Type; import java.util.Map; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; public class Foo { public static void main(String[] args) throws Exception { Gson gson = new Gson(); Type mapOfStringObjectType = new TypeToken
此示例的输出为{3=false, one=won, too=22}
。
如果示例中的Map
类型按照另一个答案中的建议更改为HashMap
,则输出变为{3=java.lang.Object@10b61fd1, one=java.lang.Object@24e2dae9, too=java.lang.Object@299209ea}
,这当然可能毫无用处。
如果由于某种原因必须将一种类型的HashMap
反序列化,则需要进行自定义反序列化处理。
如果JSON结构不是一组简单的键值对,其中值都是JSON基元,但包含像JSON对象这样的复杂类型的值,即使将所有值转换为Strings
也可以接受,也有必要实现自定义反序列化处理。
不要犹豫,继续前往Gson问题列表并提交改进的JSON原语反序列化的增强请求到适当的特定Java Object
类型,或者有一个简单的机制来转换任何值 – 包括复杂的JSON类型,如对象和数组- 在Map中转换为String
,这样就不需要如上所述的自定义反序列化处理。
如果要使用gson,则必须编写不同的类来表示来自不同方法的响应。 如果响应是简单的键值,那么您可以将响应转换为HashMap
,它将充当“通用”类,以满足您的用例中的所有类型的响应。