将JSON反序列化为未知类型的集合

我正在用Java编写一个程序,通过调用某些方法向外部API发出请求。 这些方法中的每一个都返回不同的JSON结构,它还取决于传递的参数。 我的问题是,是否有一些方法可以使用Gson反序列化响应字符串,而无需为每个方法编写不同的类。

如果不是Gson,我可以使用哪个其他库?

谢谢。

我的问题是,是否有一些方法可以使用Gson反序列化响应字符串,而无需为每个方法编写不同的类。

就在这里。 如果您不关心反序列化为特定Java类型的JSON结构只是一个包含键值对的对象,其中所有值都是JSON基元,那么可以将结构简单地反序列化为Map

请注意, Map不起作用,因为它没有为Gson提供足够的类型信息来反序列化。 Gson只为每个值创建普通的Object实例 – 不是StringInteger实例,而只是普通的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>() {}.getType(); Map map = gson.fromJson(new FileReader("input.json"), mapOfStringObjectType); System.out.println(map); } } 

此示例的输出为{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 ,它将充当“通用”类,以满足您的用例中的所有类型的响应。