使用GSON处理具有混合列表和单个属性的JSON输出

时间:2018-08-22 14:05:09

标签: java gson

早上好

我正在努力使用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 ;
}

我了解为什么它不起作用,但是我不确定如何解决它。

1 个答案:

答案 0 :(得分:0)

如果不使用自定义序列化器/反序列化器,则将无法使用GSON或其他JSON绑定。问题是这样的:

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

不能用静态类型的Java数据结构表示。在第二层,您需要一个列表或数组类型,其元素为字符串或子列表/子数组。 Java不支持此功能。您可以使用Object[]List<Object>并进行类型转换,但是绑定并非旨在解决这种情况。

我看到了三种选择:

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

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

2)您可以使用JSON解析器来生成JSONObject / JSONArray对象,并自己处理不一致性。 (如何处理取决于您自己。这取决于“结果”部分的实际含义以及您需要采取的措施。)

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