如何将URL字符串引用的远程JSON合并到当前JSON中



给定

[
  {"json1": "http://example.com/remote1.json"},
  {"json2": "http://example.com/remote2.json"}
]

remote1.jsonremote2.json分别包含 [1][2]

如何将其变成

[{"json1": [1], "json2": [2]}]

使用JQ?我认为还需要其他CLI工具,例如Bash和Curl。但是我不知道如何合并回答。

xpath/xquery具有网络访问功能,因为W3C喜欢尿道引用。如果您对其他工具开放,则可以尝试我的XPATH/XQUERY/JSONIQ解释器:

xidel master.json -e '[$json()()!{.:json($json()(.))}]'

语法:

  1. $json是输入数据

  2. json()是检索JSON

  3. 的功能
  4. ()是数组值或对象键

  5. !映射一个值的序列,其中 .是单个值

首先,我们的测试框架:

curl() {
  case $1 in
    http://example.com/remote1.json) echo "[1]" ;;
    http://example.com/remote2.json) echo "[2]" ;;
    *) echo "IMABUG" ;;
  esac
}
input_json='[
  {"json1": "http://example.com/remote1.json"},
  {"json2": "http://example.com/remote2.json"}
]'

然后,我们的实际代码:

# defines the "walk" function, which is not yet included in a released version of jq
# ...in the future, this will not be necessary.
walk_fn='
def walk(f):
  . as $in
  | if type == "object" then
      reduce keys[] as $key
        ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
  elif type == "array" then map( walk(f) ) | f
  else f
  end;
'
get_url_keys() {
  jq -r "$walk_fn
    walk(
      if type == "object" then
        to_entries
      else . end
    )
    | flatten
    | .[]
    | select(.value | test("://"))
    | [.key, .value]
    | @tsv"
}
operations=( )
options=( )
i=0
while IFS=$'t' read -r key url; do
  options+=( --arg "key$i" "$key" --argjson "value$i" "$(curl "$url")" )
  operations+=(
    " walk(
        if type == "object" then
          if .[$key$i] then .[$key$i]=$value$i else . end
        else . end
      ) "
  )
  (( ++i ))
done < <(get_url_keys <<<"$input_json")
IFS='|' # separate operations with a | character
jq -c "${options[@]}" "${walk_fn} ${operations[*]}" <<<"$input_json"

输出正确:

[{"json1":[1]},{"json2":[2]}]
  1. 已为JQ提出了网络访问,但由于安全性,复杂性,Portabilty和Bloatware的问题而被拒绝。

  2. 同样提出了炮击,但似乎还有其他路。

  3. 实现什么很容易我了解在这里是目标,使用JQ和Curl与诸如Bash之类的脚本语言结合起来。一种方法是将JSON序列化,然后使用Curl"编辑"序列化的JSON,然后再进行审理。有关JQ中的序列化/次要化函数,请参见例如如何使用JQ和BASH将JSON弄平为bash关联阵列,其中key = selector?

  4. 如果要替换所有有效URL的字符串,则可以在序列化之前或之后识别它们。如果仅要删除此类字符串的子集,则选择可能取决于特定要求。

相关内容

  • 没有找到相关文章

最新更新