从JSON创建动态对象

时间:2016-06-02 17:11:54

标签: java android json dynamic jackson

我有一个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
  }
]

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

您如何看待我的方法?我的问题是否有一个共同的解决方案?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果你在数组中混合类型,你需要我认为简单的类型信息只需将JSON解析为List<Map<String,Object>>,并在迭代时查看类型并使用

mapper.readValue(input, A.class)

mapper.readValue(input, B.class)

根据您遇到的类型。

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