将Json反序列化为Object的通用方法

时间:2018-05-18 18:23:57

标签: java json parsing generics gson

这是一个具体的问题,我无法在Gson的javadoc中获得有关此主题的任何信息。

目前,我正在尝试将Json(1)db.doc(`users/${userId}`) .get() .then(snapshot => { // ... }); 解析为对象{ "foo":"bar", "bar":"foo" }。通常我会将这些值映射到Entity对象,其中包含Entityfoo字段,但我希望从API中获得更多独立

对于(1)我有

bar

但是如果我们测试另一个端点,结果Json(2)看起来像

public class Entity { String foo; String bar; }

这使我之前构建的{ "notFoo":"bar", "notBar":"foo" } 无用,我需要创建一个新的类,其中包含相应的字段。

所以我的实际问题是:

  1. 是否有泛型(比我的示例更通用)方法 将Json推入Entity - > GenericEntity即使使用不同的端点,json的每个字段都会成功映射?

  2. 或者,还有其他依赖项支持开箱即用吗?

2 个答案:

答案 0 :(得分:0)

您可以使用Multiple GSON @SerializedName per field?中所写的注释@serializedName。但架构必须相同,您只能选择键名。

答案 1 :(得分:0)

您没有反序列化问题,您有一个不知道如何表示可能异构数据的问题。

没有必要说它应该是Object因为它应该是Object下游的某种类型,可能不止一个。首先解决这个问题:定义您可能想要用于所有用例的所有类型,然后您很可能会看到如何解决反序列化问题。

当然,对于在{...}之间定义的任何JSON文本,您始终可以使用Map<String, Object>,其中Object是其中之一:

  • 进一步Map<String, Object>其中Object遵循这些规则
  • List<Object>其中Object遵循这些规则
  • String
  • 原子类型之一或其盒装值

根据上述规则,您可以表示或多或少的所有内容,您可以编写Gson反序列化器,根据每个节点的JSON类型(通过JSON树进行迭代)为您提供这些类型。但是,对于这种异构的无类型数据结构,您是否可以使用它并不是很清楚。