无法形成正确的 JQ 以从 JSON 数据获得正确的输出

问题描述 投票:0回答:2

我正在使用JQ Play。

这是我的 JSON 数据 -

{
"body": {
"name": "DATATYPES",
"primarykey": [
  "db_number"
],
"members": [
  {
    "name": "db_number",
    "type": "NUMBER"
  },
  {
    "name": "db_date",
    "type": "DATE"
  },
  {
    "name": "db_timestamp",
    "type": "TIMESTAMP(6)"
  },
  {
    "name": "db_timestamp_with_local_time_zone",
    "type": "TIMESTAMP(6) WITH LOCAL TIME ZONE"
  },
  {
    "name": "db_char",
    "type": "CHAR"
  },
  {
    "name": "db_float",
    "type": "FLOAT"
  },
  {
    "name": "db_nchar",
    "type": "NCHAR"
  },
  {
    "name": "db_nvarchar2",
    "type": "NVARCHAR2"
  },
  {
    "name": "db_varchar2",
    "type": "VARCHAR2"
  },
  {
    "name": "db_binary_float",
    "type": "BINARY_FLOAT"
  },
  {
    "name": "db_binary_double",
    "type": "BINARY_DOUBLE"
  },
  {
    "name": "db_timestamp_with_time_zone",
    "type": "TIMESTAMP(6) WITH TIME ZONE"
  },
  {
    "name": "db_interval_year_to_month",
    "type": "INTERVAL YEAR(2) TO MONTH"
  },
  {
    "name": "db_interval_day_to_second",
    "type": "INTERVAL DAY(2) TO SECOND(6)"
  },
  {
    "name": "db_long",
    "type": "LONG"
  },
  {
    "name": "db_blob",
    "type": "BLOB"
  },
  {
    "name": "db_clob",
    "type": "CLOB"
  },
  {
    "name": "db_boolean",
    "type": "CHAR"
  }
  ],
  "links": [
  {
    "rel": "collection",
    "href": "https://tdcvm28s16.bcone.com:7002/ords/testords/metadata-catalog/",
    "mediaType": "application/json"
  },
  {
    "rel": "canonical",
    "href": "https://tdcvm28s16.bcone.com:7002/ords/testords/metadata-catalog/datatypes/",
    "mediaType": "application/json"
  },
  {
    "rel": "alternate",
    "href": "https://tdcvm28s16.bcone.com:7002/ords/testords/open-api-catalog/datatypes/",
    "mediaType": "application/openapi+json"
  },
  {
    "rel": "describes",
    "href": "https://tdcvm28s16.bcone.com:7002/ords/testords/datatypes/"
  }
  ]
  }
  }

我的第一个JQ -

{"parameters":([.body.primarykey[0]] | reduce .[] as $item ({}; .[$item] = ""))}

输出-

{
"parameters": {
"db_number": ""
}
}

在这里,我的要求是 - 我希望通过与成员的匹配记录进行比较,在输出参数中也包含主要类型。

我的预期输出是-

{
"parameters": {
"db_number": "number"
}
}

请帮助我找到可以在 jqplay.org 中使用的正确 JQ

我的第二个JQ -

.body.primarykey[] as $k | {  parameters: {($k): "" }, body: (.body.members | map( 
select(.name != $k) | {(.name): .type |ascii_downcase}) | add)}

在这里,我的要求是 - 我想要与上面相同的参数,以及主键类型和正文,从而消除正文中匹配的主键。

我的预期输出是-

{
"parameters": {
"db_number": "number"
},
"body": {
"db_date": "date",
"db_timestamp": "timestamp(6)",
"db_timestamp_with_local_time_zone": "timestamp(6) with local time zone",
"db_char": "char",
"db_float": "float",
"db_nchar": "nchar",
"db_nvarchar2": "nvarchar2",
"db_varchar2": "varchar2",
"db_binary_float": "binary_float",
"db_binary_double": "binary_double",
"db_timestamp_with_time_zone": "timestamp(6) with time zone",
"db_interval_year_to_month": "interval year(2) to month",
"db_interval_day_to_second": "interval day(2) to second(6)",
"db_long": "long",
"db_blob": "blob",
"db_clob": "clob",
"db_boolean": "char"
}
}

请帮助我找到可以在 jqplay.org 中使用的正确 JQ

json jq
2个回答
2
投票

对于您的第一个结果:

jq '.body
   |( .members | map(.value=(.type|ascii_downcase)) | from_entries ) as $mapping
   |{parameters:(.primarykey | map({key:., value:$mapping[.]}) | from_entries)
}' input.json

然后是第二个结果:

jq '.body
   |( .members | map(.value=(.type|ascii_downcase)) | from_entries ) as $mapping
   |{parameters:(.primarykey | map({key:., value:$mapping[.]}) | from_entries),
     body:$mapping
}' input.json

jq-play


1
投票

如果你切得太早,你就会失去参考,但为了获得你需要的值,你必须再次迭代

.members
,找到正确的键,再次调整大小写,等等。

这是原始尝试的重构版本,它仅根据主键数组中的包含性对成员进行分组,然后将每个部分分配给输出对象中的正确键。

.body | . as {$primarykey} | .members
| map(.value = (.type | ascii_downcase))
| group_by(IN(.name; $primarykey[])) | map(from_entries)
| {parameters: last, body: first}
{
  "parameters": {
    "db_number": "number"
  },
  "body": {
    "db_date": "date",
    "db_timestamp": "timestamp(6)",
    "db_timestamp_with_local_time_zone": "timestamp(6) with local time zone",
    "db_char": "char",
    "db_float": "float",
    "db_nchar": "nchar",
    "db_nvarchar2": "nvarchar2",
    "db_varchar2": "varchar2",
    "db_binary_float": "binary_float",
    "db_binary_double": "binary_double",
    "db_timestamp_with_time_zone": "timestamp(6) with time zone",
    "db_interval_year_to_month": "interval year(2) to month",
    "db_interval_day_to_second": "interval day(2) to second(6)",
    "db_long": "long",
    "db_blob": "blob",
    "db_clob": "clob",
    "db_boolean": "char"
  }
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.