【问题标题】:How to lift the value of a JSON object that is nested two levels deep?如何提升嵌套两层深度的 JSON 对象的值?
【发布时间】:2017-01-14 06:26:15
【问题描述】:

鉴于我从 Pocket API 收到的以下 test.json 响应,

{
"complete": 1,
"error": null,
"list": {
    "1000055792": {
        "excerpt": "Some Text",
        "favorite": "0",
        "given_title": "Some Title",
        "given_url": "Some URL",
        "has_image": "0",
        "has_video": "0",
        "is_article": "1",
        "is_index": "0",
        "item_id": "1000055792",
        "resolved_id": "1000055792",
        "resolved_title": "Title",
        "resolved_url": "Some URL",
        "sort_id": 700,
        "status": "1",
        "time_added": "1438646514",
        "time_favorited": "0",
        "time_read": "1439025088",
        "time_updated": "1439025090",
        "word_count": "10549"
    },
    "1000102810": {
        "excerpt": "Some Text",
        "favorite": "0",
        "given_title": "Title",
        "given_url": "Some URL",
        "has_image": "1",
        "has_video": "0",
        "is_article": "1",
        "is_index": "0",
        "item_id": "1000102810",
        "resolved_id": "1000102810",
        "resolved_title": "Title",
        "resolved_url": "Resolved URL",
        "sort_id": 650,
        "status": "1",
        "time_added": "1440303789",
        "time_favorited": "0",
        "time_read": "1440320729",
        "time_updated": "1440320731",
        "word_count": "3219"
    }

如何访问 resolved_titleword_count 等键的值。它们嵌套在一个数字对象中,与id 相同,后者本身嵌套在list 中。我已经搜索并找到了一种使用 jq 访问嵌套对象的方法。但是如何访问嵌套在主 list 对象内的另一个对象中的值?

另外,ID 是不同的,不是连续的,所以我认为递归是不可能的,但我可能是错的。我打算用这些数据做的是只提取每个项目的resolved_titleword_count 值并将它们保存到一个两列的电子表格中。

提前致谢!

【问题讨论】:

  • 你用什么语言做这个? javascript?您添加了“命令行”标签,那么您使用的是 node.js 吗?还是其他语言?
  • @KenB 问题和标签都提到了jq
  • 啊抱歉,我以为jq 指的是jQuery,现在我看到它是一个用于导航JSON 的命令行工具
  • @tripleee 是的,我之前提到过您的线程,但您遇到的问题是嵌套对象的深度一级。我试过了,但很遗憾,它没有用。

标签: json command-line jq pocket


【解决方案1】:

以下内容可以轻松扩展和/或调整:

> jq ".list[] | {resolved_title, word_count}" input.json

输出:

{
  "resolved_title": "Title",
  "word_count": "10549"
}
{
  "resolved_title": "Title",
  "word_count": "3219"
}

【讨论】:

    【解决方案2】:

    您可以使用.[] 运算符来遍历数组中的所有元素(或在本例中为所有键)。以下将在单独的行上为您提供每个字段的输出:

    cat <file_with_json> | jq '.list | .[] | .resolved_title, .word_count'
    

    第一个过滤器仅作用于list 元素。第二个过滤器显示for every element,最后输出只是resolved_title.word_count 字段。这会产生以下结果:

    "Title"
    "3219"
    "Title"
    "10549"
    

    【讨论】:

    • 感谢您的帮助。有效。您提到“第一个过滤器仅在 list 元素上运行......”。通过过滤器,我假设您的意思是 '.list 部分,还是我错了?
    • 没错——.list 是一个过滤器,意思是“获取列表值”
    【解决方案3】:

    试试map():

    $ cat myfile.json | jq '.list | map({resolved_title: .resolved_title, word_count: .word_count})'
    [
      {
        "resolved_title": "Title",
        "word_count": "10549"
      },
      {
        "resolved_title": "Title",
        "word_count": "3219"
      }
    ]
    

    【讨论】:

    • 成功了,谢谢。有点题外话,但如果您不介意,我可以问另一个与命令行相关的问题吗?我可以将某个命令的输出作为输入提供给另一个命令,而不必将中间结果保存为文件。我的具体意思是,我可以使用从 Pocket 下载数据并将其传递到您编写的代码的命令,使用 &gt; 运算符吗?再次感谢。 :)
    • 只要Pocket支持发送到stdout,你就可以通过管道|将Pocket的输出传递给jq
    • @AkhilUnnikrishnan 是的,任何向终端输出文本的命令都可以使用管道字符 (|) 输入到 jq,其中包括您使用 &gt; 的任何命令将其输出重定向到文件中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2021-07-18
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多