我正在使用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
对于您的第一个结果:
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
如果你切得太早,你就会失去参考,但为了获得你需要的值,你必须再次迭代
.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"
}
}