我正在编写 Bash 脚本。在其中,有几次我需要解析一些 JSON。我通常的做法如下:
MY_JSON=$(some command that prints JSON to stdout)
RESULT=$(python -c "import json,sys;data=json.load(sys.stdin); python code here that prints out the value(s) I need")
Run Code Online (Sandbox Code Playgroud)
这往往效果很好。然而,昨天我遇到了一个问题。我有以下代码:
MY_JSON=$(command that returns JSON containing an array of IDs)
IDS=$(echo "${MY_JSON}" | python -c "import json,sys;data=json.load(sys.stdin); for a in data['array']: print(a['id'])")
Run Code Online (Sandbox Code Playgroud)
当我运行该代码时,出现“语法错误”,插入符号指向fin for。
在我的谷歌搜索中,我发现的一切都表明,当您在语句的第一个字符上遇到语法错误时,通常意味着您在前一个语句中搞砸了一些事情。但是,如果我完全删除 for 循环,则不会出现语法错误。所以,很明显,问题出在循环上。
我做错了什么?语法错误怎么可能是有效关键字的第一个字符?
我最终找到了答案,我将在下面发布该答案以帮助其他试图构建涉及for循环的Python 单行程序的人——但我希望有人能给出更好的答案,也许使用理解(我不完全理解)或其他东西而不是 for 循环,以便我实际上可以在一行中完成此操作。使用 Python 以外的语言也是可以接受的,只要它在 Linux 主机上通常可用。
需要明确的是,我会寻找使用真正的JSON解析方案,用你喜欢的字符串操作工具(不是有些近似sed,awk等),这将是脆弱的对于喜欢的东西是否适合打印的JSON。
在声明Python的语法被分成两组,简单语句和复合语句:
stmt: simple_stmt | compound_stmt
Run Code Online (Sandbox Code Playgroud)
只有简单语句可以包含;,并且简单语句仅限于所谓的小语句:
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
Run Code Online (Sandbox Code Playgroud)
小语句不包括for循环。
small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
import_stmt | global_stmt | nonlocal_stmt | assert_stmt)
Run Code Online (Sandbox Code Playgroud)
一for回路,而是一个复合语句:
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmtRun Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |