使用 Unix 工具解析 JSON

2023-12-01

我正在尝试解析从curl请求返回的JSON,如下所示:

curl 'http://twitter.com/users/username.json' |
    sed -e 's/[{}]/''/g' | 
    awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'

上面将 JSON 拆分为字段,例如:

% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...

如何打印特定字段(由-v k=text)?


有许多专门设计用于从命令行操作 JSON 的工具,并且比使用 Awk 更容易、更可靠,例如jq:

curl -s 'https://api.github.com/users/lambda' | jq -r '.name'

您还可以使用系统上可能已安装的工具来执行此操作,例如使用 Pythonjson module,从而避免任何额外的依赖关系,同时仍然拥有适当的 JSON 解析器的好处。以下假设您想要使用 UTF-8,原始 JSON 应该使用 UTF-8 进行编码,并且大多数现代终端也使用这种编码:

Python 3:

curl -s 'https://api.github.com/users/lambda' | \
    python3 -c "import sys, json; print(json.load(sys.stdin)['name'])"

Python 2:

export PYTHONIOENCODING=utf8
curl -s 'https://api.github.com/users/lambda' | \
    python2 -c "import sys, json; print json.load(sys.stdin)['name']"

经常问的问题

为什么不采用纯 shell 解决方案?

标准POSIX/单一 Unix 规范 shell是一种非常有限的语言,不包含表示序列(列表或数组)或关联数组(在某些其他语言中也称为哈希表、映射、字典或对象)的工具。这使得在可移植 shell 脚本中表示解析 JSON 的结果有些棘手。有有点古怪的方法,但如果键或值包含某些特殊字符,其中许多可能会中断。

Bash 4 及更高版本、zsh 和 ksh 支持数组和关联数组,但这些 shell 并非普遍可用(由于从 GPLv2 更改为 GPLv3,macOS 在 Bash 3 上停止更新 Bash,而许多 Linux 系统没有zsh 开箱即用)。您可以编写一个可以在 Bash 4 或 zsh 中运行的脚本,其中一个可以在当今的大多数 macOS、Linux 和 BSD 系统上使用,但是编写适用于这样的 shell 的 shebang 行是很困难的。多语言脚本。

最后,在 shell 中编写一个成熟的 JSON 解析器将是一个足够重要的依赖项,您不妨使用 jq 或 Python 等现有依赖项来代替。要想实现良好的实现,不会是一行,甚至是五行的小片段。

为什么不使用 awk、sed 或 grep?

可以使用这些工具从具有已知形状并以已知方式格式化的 JSON 中进行一些快速提取,例如每行一个键。其他答案中有几个对此建议的示例。

然而,这些工具是为基于行或基于记录的格式而设计的;它们不是为递归解析具有可能的转义字符的匹配分隔符而设计的。

因此,这些使用 awk/sed/grep 的快速而肮脏的解决方案可能很脆弱,并且如果输入格式的某些方面发生变化(例如折叠空格,或向 JSON 对象添加额外的嵌套级别,或内部的转义引号),就会中断。一个字符串。一个足够强大、能够在不中断的情况下处理所有 JSON 输入的解决方案也将相当大和复杂,因此与添加另一个依赖项没有太大不同jq或Python。

我之前曾处理过由于 shell 脚本中的输入解析不佳而导致大量客户数据被删除的情况,因此我从不推荐快速而肮脏的方法,因为这样可能会很脆弱。如果您正在进行一些一次性处理,请参阅其他答案以获取建议,但我仍然强烈建议仅使用现有的经过测试的 JSON 解析器。

历史笔记

这个答案最初推荐jsawk,它应该仍然有效,但使用起来比jq,并且依赖于安装的独立 JavaScript 解释器,该解释器比 Python 解释器不太常见,因此上面的答案可能更可取:

curl -s 'https://api.github.com/users/lambda' | jsawk -a 'return this.name'

这个答案最初也使用了问题中的 Twitter API,但该 API 不再起作用,因此很难复制示例进行测试,并且新的 Twitter API 需要 API 密钥,因此我转而使用 GitHub API无需 API 密钥即可轻松使用。原始问题的第一个答案是:

curl 'http://twitter.com/users/username.json' | jq -r '.text'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Unix 工具解析 JSON 的相关文章

  • 如何在 Bash 中删除字符串的第一部分?

    该代码将给出第一部分 但是如何删除它并获取没有第一部分的整个字符串 echo first second third etc cut d f1 你应该看看info cut 这将解释什么f1 means 实际上我们只需要第二个字段之后的字段 f
  • javax.xml.transform.TransformerException: java.io.FileNotFoundException: (访问被拒绝)

    我在最后一行代码中遇到异常 Transformer transformer TransformerFactory newInstance newTransformer DOMSource xmlSource new DOMSource do
  • 实体创建无用的 id 字段

    我有一个CrudRepository与两个实体 Problem 特征实体总是创建一个附加的id数据库中的字段但未选择正确的characteristic id要生成的字段JSON machine entity machine id name
  • 如何绕过 CF8 编码不可打印字符中的 SerializeJSON?

    SerializeJSON 创建具有不可打印字符 即 ASCII 21 的 JSON 这是无效的 JSON 我该如何解决这个问题 删除不可打印字符的正则表达式会起作用吗 什么正则表达式会删除不可打印的字符 嗯 这个简单的解决方案是为 cff
  • 用于一个自定义字段的 Jackson 反序列化器?

    我相信我们需要一个自定义反序列化器来对我们类中的一个字段执行特定的操作 看来一旦我这样做了 我现在就负责反序列化所有其他字段 有没有办法让杰克逊反序列化所有字段except我在这里关心的那个人 public class ThingDeser
  • 如何在 Bash 脚本中查找数字的阶乘?

    在 shell 脚本中如何查找数字的阶乘 seq s 1 500 bc
  • Python 子进程:无法转义引号

    我知道以前曾问过类似的问题 但它们似乎都是通过重新设计参数的传递方式 即使用列表等 来解决的 但是 我这里有一个问题 因为我没有这个选项 有一个特定的命令行程序 我使用的是 Bash shell 我必须向其传递带引号的字符串 它不能不被引用
  • 通过 ssh 运行 Bash 脚本

    我正在尝试编写一个 Bash 脚本 它将通过 SSH 连接到计算机并创建一个目录 长期目标有点复杂 但现在我从简单的开始 然而 虽然很简单 但我似乎不太明白 这是我的代码 bin bash ssh T email protected cdn
  • Python-如何删除 json 字符串中最后的逗号(,)

    嗨 我刚刚开始尝试 python tornado 和 mongodb 我是新手 我编写了一个简单的 get 函数来从 mongodb 获取所有值并以 JSON 格式返回 问题是 当我尝试将输出写入 JSON 字符串时 我在集合中的最后一条记
  • Oracle/PHP - ORA-00911 更新时的无效字符

    我正在运行一个 PHP 脚本 该脚本从 Oracle 数据库实例更新表 首先 我收到一个 JSON 对象 lot KLMHA17N9N00 requestor B10078 id FRESHLOT username B26696 passw
  • Json.dump 失败并显示“必须是 unicode,而不是 str”TypeError

    我有一个 json 文件 其中恰好有大量中文和日文 以及其他语言 字符 我将其加载到我的 python 2 7 脚本中使用io open如下 with io open multiIdName json encoding utf 8 as j
  • 计算机AI算法写句子?

    我正在寻找有关处理文本句子或在创建在正常人类语言 例如英语 中有效的句子时遵循结构的算法的信息 我想知道这个领域是否有我可以学习或开始使用的项目 例如 如果我给一个程序一个名词 为其提供同义词库 相关单词 和词性 以便它理解每个单词在句子中
  • 如果文件修改日期早于 N 天

    此问题涉及在文件的修改日期早于这么多天时采取行动 我确信创建日期或访问日期会类似 但对于修改日期 如果我有 file path name to some file N 100 for example N is number of days
  • BASH 中带有千位分隔符的数字格式

    我有一个号码12343423455 23353 我想用千位分隔符格式化数字 所以输出将是12 343 423 455 23353 printf 3f n 12345678 901 12 345 678 901
  • 将新属性动态添加到 Node 中现有的 JSON 数组中

    我需要添加当前 JSON 中不存在的属性 json 对象如下所示 var jsonObj result OK data 我想在 数据 中添加温度 我可以像下面那样做 jsonObj data push temperature 然后 我想在
  • 气流:如何将读取 json 文件的方法放入本地库中

    我必须产生一些DAG 我已将 json 表架构文件保存在GCP铲斗 https cloud google com storage docs json api v1 buckets GCP 存储桶上的文件关联到composer将被重新映射到
  • 使用转义序列渲染文本(如终端)

    你好 我正在寻找一些库或工具来在文本文件中呈现带有转义序列字符的文本 我不知道如何称呼它 但这是一个例子 echo e abc vdef abc def echo e abc vdef gt tmp xxxxx vi tmp xxxxx 我
  • 如何按单个整数字段对 JSON 进行排序? [复制]

    这个问题在这里已经有答案了 我有以下 JSON title title order 0 order 9 order 2 JSON 包含很多字段 我如何根据字段对它们进行排序order field 我一直在寻找 Nodejs 中内置的东西 但
  • Rails escape_javascript 通过转义单引号创建无效的 JSON

    ActionView中的escape javascript方法转义撇号 作为反斜杠撇号 解析为 JSON 时会出错 例如 消息 我在这里 在打印时是有效的 JSON message I m here But 输出 I m here 导致无效
  • 水银大号

    你知道如何让 Quicksilver 在屏幕上显示大量的大字体吗 通过点击 然后输入自由文本 选择 操作 下的 查看大字体 并按 Enter 键 好吧 有谁知道一种以编程方式做到这一点的方法吗 另外 quicksilver 是必需的还是内置

随机推荐

  • 添加时出现有趣的(四舍五入?)错误

    一列包含数字 始终保留 2 位小数 有些是计算得出的 但所有乘法和除法四舍五入到 2 位小数 另一列是累积的 累积列有公式
  • 在主页上显示类别及其产品,Magento 1.9

    我想在主页上显示一个类别及其产品 Magento 内置了在主页上显示新产品的选项 但我不知道如何在主页上显示不同的类别 例如我创建了一个类别 我想在主页上显示该类别中的产品 如下所示 特色产品 产品1 产品2 产品3 我已经尝试过下面的代码
  • 如何更改 perf_event_open 最大采样率

    我正在使用 perf event open 来获取样本 我试图让每个人都切中要害 但 perf event open 不够快 我尝试使用以下命令更改采样率 echo 10000000 gt proc sys kernel perf even
  • 权限被拒绝(公钥)。致命:无法从远程存储库读取

    我的中有以下内容 git config 1 core 2 repositoryformatversion 0 3 filemode true 4 bare false 5 logallrefupdates true 6 remote ori
  • Java 8 在分组时不保持顺序

    我正在使用 Java 8 按数据分组 但获得的结果并不是按顺序形成的 Map
  • 将 NSUInteger 添加到 NSMutableArray

    您好 我正在开发一个项目 我正在尝试将 NSUInteger 添加到 NSMutableArray 中 总的来说 我对 Objective C 和 C 都很陌生 当我运行应用程序时 NSLog 显示 null 我将不胜感激任何人能够提供的任
  • 滑动切换下一个元素

    我想要 5 个 p 单击时显示的标签 p div 那是在下面 我可以在我命名每个的地方做到这一点 p 和每个 p div 不同 但这会导致很多 jQuery 所以 目前我有 p class flip Example p div class
  • 如何从应用程序对 Xcode 项目进行逆向工程?

    Xcode 删除了我的项目 一切都消失了 我唯一拥有的是 iPhone 6 中的应用程序 那么有什么方法可以检索应用程序的 Xcode 项目呢 Update 我找到了所有文件 现在我只需要在新项目中重新组装它们 但我不知道怎么办 让我们明确
  • C# 线程暂停和恢复

    我有多个线程 如何暂停 恢复它们 来自重复的问题 我如何暂停 5 个线程 并记住它们的状态 因为其中一个在吃 另一个在思考 等等 如果您正在使用System Threading Thread 然后你可以打电话Suspend and Resu
  • Python 并行迭代列表?

    我创建了一个列表 其中包含不超过 8 个项目 现在我使用标准 for 循环 for item in list 循环该项目 我想知道是否有一种方法可以准确检查所有元素同时 我看过一些关于使用 zip 同时迭代 2 个列表的帖子 这可能会有所帮
  • 在 JavaScript 中高效解析电子邮件正文

    我需要解析多个电子邮件正文 如下所示 Name Bob smith Email email protected Phone Number 4243331212 作为较大程序的一部分 我有以下函数来解析页面 function parseBod
  • ScrollView 中的可缩放 TextView

    我想做一个TextView可以根据捏缩放来更改文本的大小 这TextView是在一个里面ScrollView 我有TextView捏合时缩放 但仅当您几乎完全水平地移动手指时 如果捏缩放有垂直组件 则默认为滚动而不是缩放 有没有办法禁用滚动
  • 如何将QPushButton插入TableView?

    我正在实施QAbstractTableModel我想插入一个QPushButton在每行的最后一列 当用户单击此按钮时 将显示一个新窗口 其中包含有关此行 的更多信息 您知道如何插入按钮吗 我了解委托系统 但所有示例都只是关于 如何使用组合
  • 在 r 中收集多列数据

    我有一些数据 我正在尝试使用 tidy R 和 R 中更长的函数来获取输出 如下所述 但我无法做到这一点 我正在获取数据 我有这种格式的数据 还有许多其他列名称 Country State Year 1 Population 1 Year
  • 如何将cucumber集成到testNG中?

    我有一个用于由核心 JAVA TestNG 创建的框架 该框架遵循TDD模型 POM是我们的构建管理工具 有人可以告诉我是否有可能使用 Cucumber 将框架从 TDD 更新为 BDD 但我仍然想对这个要求做最小的改变 比如不改变任何现有
  • 尝试在 DF 的切片副本上设置值

    我正在用 pandas 和 python 做一些事情 我有下一个代码 df pd read csv Request csv keep default na False df1 df loc df Request Status Closed
  • 为什么这个 preg_replace 调用返回 NULL?

    为什么这个调用返回NULL 正则表达式错误吗 随着test输入它不返回NULL 文档说 NULL 表示错误 但它可能是什么错误 s hex2bin 5b5d202073205b0d0a0d0a0d0a0d0a2020202020202020
  • 如何使用以用户定义类型为键的 std::maps ?

    我想知道为什么我不能将 STL 映射与用户定义的类一起使用 当我编译下面的代码时 我收到以下神秘的错误消息 这是什么意思 另外 为什么它只发生在用户定义的类型上 原始类型用作键时是可以的 C MinGW bin lib gcc mingw3
  • 在 Woocommerce 中将结帐国家/地区下拉菜单设置为只读

    I want country dropdown on woocommerce as readonly 我已经将默认国家 地区设置为澳大利亚 但我希望它们是只读的 Kashalo 的答案是正确的 您还可以使用其他多种方法之一 1 仅适用于结帐
  • 使用 Unix 工具解析 JSON

    我正在尝试解析从curl请求返回的JSON 如下所示 curl http twitter com users username json sed e s g awk v k text n split 0 a for i 1 i lt n i