【问题标题】:Parsing json returned with schema element in Java在 Java 中解析带有模式元素返回的 json
【发布时间】:2020-06-02 18:09:17
【问题描述】:

我有一个关于 json 的问题。 json是否低于某种标准。我可以看到为什么它更可取,因为元素名称只写一次并且包含数据类型。我无法更改 JSON 的输入方式,但是否有可以轻松解析它的 Java 库?当然我可以循环和循环,但必须有一些东西可以解析它。我对 Jackson 和 org.json 都进行了尝试,但都失败了,因为它在开始时是一个数组。 “jq”也会解析它,我可以得到我想要作为 COUNT 的值“100”,但是如果架构与直接引用数组索引不同,则会中断。

[
  {
    "header": {
      "queryId": "query_1590948930986",
      "schema": "`ROWKEY` STRING KEY, `USERID` STRING, `ENTITYTYPE` STRING, `ENTITYID` STRING, `DATESEARCHED` STRING, `COUNT` BIGINT"
    }
  },
  {
    "row": {
      "columns": [
        "6938bb62-50a1-4d0b-a113-1ecca1082763|+|n|+|09066437|+|2020-05-11",
        "6938bb62-50a1-4d0b-a113-1ecca1082763",
        "n",
        "09066437",
        "2020-05-11",
        100
      ]
    }
  }
]

在 jq 我可以做到这一点。但如果架构元素不同,则会失败。

| jq '.[1].row.columns[5]'

【问题讨论】:

标签: java json apache-kafka ksqldb


【解决方案1】:

返回的 JSON 有效。它是一个 JSON 数组,包含两个 JSON 对象,每个对象定义不同的属性。

在这种特定情况下,数组中的第一个元素包含有关响应的元数据,包括查询 ID(可能包含在服务器日志行或处理日志中的错误中),以及在后续元素的 row.columns 数组。

例如,值"6938bb62-50a1-4d0b-a113-1ecca1082763|+|n|+|09066437|+|2020-05-11" 对应于ROWKEY STRING KEY 列。

您可以使用 Jackson 解析这些数据。但是,Jackson 期望数组中的所有元素共享一个公共类型。要使用 Jackson 反序列化,您需要一个通用的基本类型,例如ResponseElement 和两个子类型,例如HeaderElementRowElement,带有适当的字段。然后,您可以将 JSON 反序列化为 List<ResponseElement>

关于如何反序列化具有不同元素类型的数组的更多信息可以在这里找到:

How to deserialize a JSON array of elements with different types and varying number of elements?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多