【问题标题】:Processing JSON output with GSON with mixed lists and single attributes使用具有混合列表和单一属性的 GSON 处理 JSON 输出
【发布时间】:2018-08-22 14:05:08
【问题描述】:

早上好,

我正在努力使用 GSON 来解析来自特定 Web 服务的一些 JSON 输出。这是一些示例输出:

[
    {
        "count": 1,
        "headings": [
            "name",
            "hosts",
            "Model",
        ],
        "kind": "Cluster",
        "offset": 0,
        "results": [
            [
                "cluster1",
                [
                   "host1",
                   "host2"
                ],
                [
                   "Virtual Machine",
                   "Virtual Machine"
                ]
            ]
        ]
    }
]

“结果”部分是我无法处理的部分。基本上,由于结果具有混合类型、列表和字符串,我无法编写表示它的对象。我一直在阅读这可能需要反序列化器。我对此略有了解,希望能深入了解如何解决此问题。

我目前使用的课程如下所示:

public class ModelDefinition
{
    public Integer count ;
    public ArrayList<String> headings ;
    public String kind ;
    public Integer next_offset ;
    public Integer offset ;
    public String results_id ;
    public String next ;
}

public class LongModelDefinition extends ModelDefinition
{
    public ArrayList<String[][]> results ;
}

我明白它为什么不起作用,但我不知道如何解决它。

【问题讨论】:

  • 我不确定 gson 是否是这种 json 的最佳工具,也许像使用 Jackson 那样处理抽象程度较低的 json 可能是更好的选择。在示例中不清楚,但是如果只有一个主机而不是两个主机,则可能会收到一个字符串而不是数组,从而增加了反序列化的复杂性。
  • 其实你是对的。这个网络服务会将任何单个元素列表变成一个字符串,最烦人的。我无法控制网络服务,我只是一个客户。到目前为止,我已经通过谨慎处理我的查询来处理这个问题。但是,它使代码变得臃肿和丑陋,我正在寻找一种更简洁的方法来处理这个问题。

标签: java gson


【解决方案1】:

如果不使用自定义序列化器/反序列化器,您将无法为此使用 GSON 或其他 JSON 绑定。问题在于:

   [
        [
            "cluster1",
            [
               "host1",
               "host2"
            ],
            [
               "Virtual Machine",
               "Virtual Machine"
            ]
        ]
   ]

不能用静态类型的 Java 数据结构表示。在第二级,您需要一个列表或数组类型,其元素是字符串或子列表/子数组。 Java 不支持这个。您可以使用 Object[]List&lt;Object&gt; 并进行类型转换,但绑定并非旨在与这种事情相辅相成。

我看到了三种选择:

1) 您可以更改此数据的架构;例如

   [
        [
            [
               "cluster1"
            ],
            [
               "host1",
               "host2"
            ],
            [
               "Virtual Machine",
               "Virtual Machine"
            ]
        ]
   ]

2) 您可以使用生成 JSONObject / JSONArray 对象的 JSON 解析器,并自己处理不均匀性。 (你如何处理它取决于你。这取决于“结果”部分的实际含义,以及你需要用它做什么。)

3) 您可以使用自定义(即手写)序列化器/反序列化器实现基于 GSON 的绑定。

【讨论】:

  • 是的,很抱歉,这三个属性后面不应该有冒号。它们是字符串列表的一部分。
猜你喜欢
  • 2019-03-11
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
相关资源
最近更新 更多