【问题标题】:Dynamic object creation from JSON从 JSON 创建动态对象
【发布时间】:2016-10-02 13:30:34
【问题描述】:

我有一个 Android 应用程序,它接收 JSON 格式的字符串。

JSON 结构包含一组不同类型的 JSON 对象。 我将为每种类型创建一个类,并希望借助 JSON 框架直接从 JSON 实例化对象。

为了简单起见,让我们考虑以下示例:

我们有两个 Java 类:

public class A
{
   public String a1 = "";

   public int a2 = 0;

}

public class B
{
   public double b1 = 0;
   public double b2 = 0;
   public double b3 = 0;
}

也不是,例如我们有一个 JSON 数组进来

[
  {
    "a1": "Teststring",
    "a2": 12
  },
  {
    "b1": 3,
    "b2": 4,
    "b3": 5
  },
  {
    "a1": "Teststring2",
    "a2": 24
  }
]

我不知道 JSON 对象将进入哪些、多少或以什么顺序。但我可以修改它们的 JSON 表示。

我能想到的一个解决方案:

据我阅读有关框架的信息,Jackson 与 GSON 相比,能够做到这两点,读取特定值并生成 Java 实例。 所以我可以向 JSON 对象添加类型信息:

    [
  {
    "type": "A",
    "a1": "Teststring",
    "a2": 12
  },
  {
    "type": "B",
    "b1": 3,
    "b2": 4,
    "b3": 5
  },
  {
    "type": "A",
    "a1": "Teststring2",
    "a2": 24
  }
]

比从 type 中读取值,然后从中生成正确的对象。

你觉得我的方法怎么样?我的问题有通用的解决方案吗?

【问题讨论】:

  • 你对发送的json对象有控制权吗?我的意思是,如果它是发送 json 响应的服务器,您是在控制服务器还是已经在运行服务器?
  • 我正在控制服务器。
  • 然后,就像你说的提到你在 json 对象本身中发送的对象的类型。既安全又减少客户端的工作量。

标签: java android json dynamic jackson


【解决方案1】:

为什么不使用 json 对象并将对象作为成员添加到数组中,而不是将所有内容都放在一个数组中,并使用通用名称(比如说,类型和一些索引)。

    {
        "A0":
        { ... },
        "B0":
        { ... },
        "A1":
        { ... },
    }

【讨论】:

  • 然后您可以遍历 json 对象成员并通过查看相应的键来确定每个单独的类型。
【解决方案2】:

如果您在数组中混合类型,则需要类型信息以使事情变得简单,只需将 JSON 解析为 List<Map<String,Object>> 并在迭代时查看类型并使用其中一个

mapper.readValue(input, A.class)

或

mapper.readValue(input, B.class)

根据您遇到的类型。

您可以跳过此映射步骤,也可以只对Map<String,Object> 进行操作,以避免额外的开销。效率和漂亮的代码有时不能齐头并进;)

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 2023-01-25
    • 2019-10-21
    • 2016-09-04
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2014-12-13
    相关资源
    最近更新 更多