代码之家  ›  专栏  ›  技术社区  ›  PesaThe

如何解析数据类型不一致的JSON?

  •  2
  • PesaThe  · 技术社区  · 7 年前

    我需要创造一个 csv 来自a的报告 JSON 以下结构的文件(尽我所能简化):

    {
      "data": [
        {
          "id": "123",
          "foo": {
            "item": {
              "value": "foo_good",
              "bar_id": "1"
            }
          },
          "bar": {
            "item": {
              "id": "1",
              "value": "bar_value_1a"
            }
          },
          "var": {
            "item": {
              "value": "var_value_1a",
              "bar_id": "1"
            }
          }
        },
        {
          "id": "456",
          "foo": {
            "item": [
              {
                "value": "foo_bad",
                "bar_id": "1"
              },
              {
                "value": "foo_good",
                "bar_id": "2"
              },
              {
                "value": "foo_good",
                "bar_id": "2"
              },
              {
                "value": "foo_bad",
                "bar_id": "3"
              },
              {
                "value": "foo_good",
                "bar_id": "4"
              }
            ]
          },
          "bar": {
            "item": [
              {
                "id": "1",
                "value": "bar_value_2a"
              },
              {
                "id": "2",
                "value": "bar_value_2b"
              },
              {
                "id": "3",
                "value": "bar_value_2c"
              },
              {
                "id": "4",
                "value": "bar_value_2d"
              }
            ]
          },
          "var": {
            "item": [
              {
                "value": "var_value_2a",
                "bar_id": "1"
              },
              {
                "value": "var_value_2b",
                "bar_id": "2"
              },
              {
                "value": "var_value_2c",
                "bar_id": "3"
              },
              {
                "value": "var_value_2d",
                "bar_id": "4"
              }
            ]
          }
        }
      ]
    }
    

    数据结构:

    1. foo.item 和 var.item 连接到 bar.item bar_id
    2. 一个或多个 指向一个 条形图项目
    3. 食品 指向同一个 条形图项目 foo.item.value
    4. 正好一个 变量项 指向一
    5. 所有项目都按 酒吧id
    6. 格式是 不一致的 . 如果只有一个项,则为对象,否则为数组(适用于 食品 和 以及)
    7. 我被这种格式困住了

    1. 全部处理 data 物体
    2. 条形图项目 确实如此 有任何对应的 有价值的 foo_bad
    3. .id, .bar.item.value, .var.item.value

    我的尝试:

    jq 我当前使用的脚本丢弃多个 条形图项目 等等,仅仅是对真实数据的估计:

    .data[]
    | .foo.item |= if type=="array" then .[0] else . end
    | .bar.item |= if type=="array" then .[0] else . end
    | .var.item |= if type=="array" then .[0] else . end
    | select(.foo.item.value != "foo_bad")
    | [.id,.bar.item.value,.var.item.value]
    | @csv
    

    "123","bar_value_1a","var_value_1a"
    

    期望输出:

    "123","bar_value_1a","var_value_1a"
    "456","bar_value_2b","var_value_2b"
    "456","bar_value_2d","var_value_2d"
    

    我更喜欢用 jq公司 尽管我不坚持。

    1 回复  |  直到 7 年前
        1
  •  1
  •   peak    7 年前

    我建议你从确保这一点开始。食品, .条形图项目,和。变量项总是数组。可以使用以下帮助函数完成此操作:

    def w: if type=="array" then . else [.] end;
    

    然后,您的jq过滤器将如下开始:

    .data[]
    | .foo.item |= w
    | .bar.item |= w
    | .var.item |= w
    

    .data[]
    | .foo.item |= w
    | .bar.item |= w
    | .var.item |= w
    | range(0; .foo.item | length) as $i
    | select(.foo.item[$i].value != "foo_bad")
    | select(.bar.item[$i].value)
    | [.id,.bar.item[$i].value,.var.item[$i].value]
    | @csv