json 如何访问具有重复字段的对象[已关闭]

00jrzges  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(117)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

13小时前关门了。
Improve this question
我有一个包含具有重复字段的对象的文件

[
  {
    "a": "random text",
    "b": "more random text",
    "c": "more random text",
    "b": "something else",
    "c": "more something else"
  },
  {
    "a": "random text 2",
    "b": "more random text 2",
    "c": "more random text 2",
    "b": "something else 2",
    "c": "more something else 2"
  }
]

因为我使用的是javascript,所以当我试图打印数据时,它只能识别最后一个重复字段,也就是说,我只能打印b:另外,c:更多的东西,b:其他内容2,c:我无法控制文件的源代码,所以我想知道是否有一种方法可以使用javascript来处理这个问题。另一种选择是使用bash将第二个"b"和"c"更改为类似"b2"和"c2"的内容,但并不是所有对象都有"b"和"c"。任何想法都将受到高度赞赏,谢谢!
编辑:文件的固定格式。

rmbxnbpk

rmbxnbpk1#

使用有问题的JSON作为输入:

echo Using jm
input | jm --pointer '/-' -s
echo Using jq
input | jq -n --stream '1|truncate_stream(inputs)|select(length>1)' | jq -c '{(.[0][0]): .[1]}'

产生:

Using jm
{"a": "random text"}
{"b": "more random text"}
{"c": "more random text"}
{"b": "something else"}
{"c": "more something else"}
{"a": "random text 2"}
{"b": "more random text 2"}
{"c": "more random text 2"}
{"b": "something else 2"}
{"c": "more something else 2"}
Using jq
{"a":"random text"}
{"b":"more random text"}
{"c":"more random text"}
{"b":"something else"}
{"c":"more something else"}
{"a":"random text 2"}
{"b":"more random text 2"}
{"c":"more random text 2"}
{"b":"something else 2"}
{"c":"more something else 2"}

你可以从那开始。
免责声明:jm是我为JSON机器编写的 Package 器脚本。

iszxjhcz

iszxjhcz2#

下面的代码更加复杂,但它确实有助于保持输入中JSON对象的不同:

jq -nc --stream 'foreach (1 | truncate_stream(inputs)) as $in ({};
   .emit = null
   | if $in|length <= 1 
     then .emit = .value | .value = null
     else $in[0] as $p
     | (.value|getpath($p)) as $v
     | .value |= setpath($p; $v + [$in[1]])
     end ;
   select(.emit).emit )
'

输出:

[{"a":["random text"],"b":["more random text","something else"],"c":["more random text","more something else"]}]
[{"a":["random text 2"],"b":["more random text 2","something else 2"],"c":["more random text 2","more something else 2"]}]

警告:上面的解决方案假设输入是一个平面JSON对象数组,如Q中所示。如果输入不采用这种形式,结果可能会出乎意料。

lc8prwob

lc8prwob3#

如果希望结果是一个数组,请考虑以下解决方案,它使用此处定义的面向流的GROUPS_BY,而不是jq的group_by,以避免使用-s选项:

jq -cn --stream '
  # Assume no collisions
  def GROUPS_BY(stream; f):
    reduce stream as $x ({}; .[$x|f|tostring] += [$x] ) | .[] ;
  [GROUPS_BY(inputs | select(length==2); .[0][0])
   | reduce map(.[0][0] = 0)[] as $kv (null; 
       getpath($kv[0]) as $v
       | setpath($kv[0]; $v + [$kv[1]]) ) ]
  | add
'

当然,这里假设输入是一个平面JSON对象数组。
结果是:

[
  {
    "a": [
      "random text"
    ],
    "b": [
      "more random text",
      "something else"
    ],
    "c": [
      "more random text",
      "more something else"
    ]
  },
  {
    "a": [
      "random text 2"
    ],
    "b": [
      "more random text 2",
      "something else 2"
    ],
    "c": [
      "more random text 2",
      "more something else 2"
    ]
  }
]

相关问题