在我看来,以下JSON看起来是有效的.

{
    "DescribeDBLogFiles": [
        {
            "LogFileName": "error/postgresql.log.2022-09-14-00",
            "LastWritten": 1663199972348,
            "Size": 3032193
        }
    ]
}

A) But, jqjson_pp和Pythonjson.tool模块将其视为invalid:

# jq 1.6
> echo "$logfiles" | jq  
parse error: Invalid numeric literal at line 1, column 2

# json_pp 4.02
> echo "$logfiles" | json_pp
malformed JSON string, neither array, object, number, string or atom, 
at character offset 0 (before "\x{1b}[?1h\x{1b}=\r{...") at /usr/bin/json_pp line 51

> python3 -m json.tool <<< "$logfiles"
Expecting value: line 1 column 1 (char 0)

B) But on the other hand,如果将上述JSON复制粘贴到在线验证器(12)中,则将其视为valid.


正如上面json_pp的错误所暗示的,hexdump <<< "$logfiles"确实显示了附加的、周围的字符.前缀是:5b1b 313f 1b68 0d3d 1b7b ....,其中7b{.


以下命令将JSON输出为logfiles变量:

logfiles=$(aws rds describe-db-log-files \
  --db-instance-identifier somedb \
  --filename-contains 2022-09-14)

# where `aws` is
alias aws='docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli:2.7.31'
> bash --version
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

我已经细读了this GitHub issue个,但还是找不出原因.我怀疑,在使用echo时,双引号不知何故被 destruct 了--一些人报告说,printf对他们来说是"有效的".

推荐答案

使用docker run --rm -it -v命令生成的JSON,在JSON数据的开头添加了一些额外的不可打印字符.这使得结果文件$logfiles无效.

T选项分配一个tty,-i选项创建一个交互shell .在本例中,-t允许shell 读取登录脚本(例如.bashrc).您的启动脚本中有一些东西正在输出ANSI转义代码.这通常是为了清理屏幕,为交互shell 设置其他内容,或者通过对数据部分进行着色来使输出更具视觉吸引力.

Json相关问答推荐

从JSON格式提取数据时分隔通用名称

Azure Data Factory JSON输出格式问题

如何使用PlayWriter循环访问JSON对象

如何使用GoFr返回XML响应?

将PostgreSQL转换为JSON对象

bash用jq获取第二条JSON记录

JOLT转换并向输出添加新数组

如何使用jolt将嵌套数据变成线性数据

将请求中的数据推送到数组中

Powershell中等效的JSONPath通配符以 Select 对象中的所有数组

使用 SwiftUI 在 API 调用中解码嵌套 JSON 响应时遇到问题

使用 boost 属性树读取 int 数组

在 JSON API Wordpress 上启用 CORS

如何在返回对象的 Spring MVC @RestController @ResponseBody 类中响应 HTTP 状态代码?

JSON Schema:验证数字或空值

我可以使用空字符串作为对象标识符吗?

可以在 SharedPreferences 中保存 JSON 数组吗?

雅虎财经全币种报价 API 文档

从调试器获取 IntelliJ Idea 中的 JSON 对象

在 .NET 中缩小缩进的 JSON 字符串