字符串内的 JSON 的 argparse

Posted

技术标签:

【中文标题】字符串内的 JSON 的 argparse【英文标题】:Argparse of a JSON that is inside a string 【发布时间】:2020-05-01 16:39:03 【问题描述】:

试图将包含 JSON 的 字符串传递给 argparse,无法将生成的内容用作正确的 JSON(json.loads 错误),需要帮助! 这是我尝试过的

import argparse
import json

parser = argparse.ArgumentParser()
parser.add_argument('-a', dest='parametros', nargs='+', type=str,
                   help='dados')
args = parser.parse_args()
print(args.parametros)

现在,我正在使用:

python test.py b'-a field1=\'pokemonmaster\' -a field2=\'"_id": "$oid": "5de", "code": 2, "field1": "pokemonmaster", "filter": "name", "descricao": "Circunst\\u00e2ncia", "data": null, "status": "1001"\''

输出是一个类型列表:

["field2='_id:", ':', '5de,', 'code:', '2,', 'field1:', 'pokemonmaster,', 'filter:', 'name,', 'descricao:', 'Circunst\\u00e2ncia,', 'data:', 'null,', 'status:', "1001'"]

我从所需的类似 JSON 的字符串中得到的最接近的是 after

aux1 = ' '.join(args.parametros)
aux2 =  aux1.split("field2=")
aux3 = ''.join(aux2)
aux4 = aux3.split('\'')
print(aux4[1])

并且输出是 str 类型:

_id: : 5de, code: 2, field1: pokemonmaster, filter: name, descricao: Circunst\u00e2ncia, data: null, status: 201

我需要的是:

"_id": "$oid": "5de", "code": 2, "field1": "pokemonmaster", "filter": "name", "descricao": "Circunst\\u00e2ncia", "data": null, "status": "1001"

问题:

1) argparse 不知何故未检测到带有 $ 美元符号的键,例如:"$oid": "5de" -> :', '5de

2)如果尝试了json.loads(aux4[1]),结果是这样的

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

3) 有没有办法在输出中正确添加引号?

【问题讨论】:

Afaict the field2 end delimiter is different from the start delimiter,对吗? 第一个命令python test.py b'-a ...' 中前导b 的目的是什么?看起来您希望它是一个字节串。 您是否尝试过在所有 -a 值周围加上引号。 我还没有尝试理解你的例子。但是 1) 通过足够的引用,您可以将有效的 json 字符串作为命令行值传递(如有疑问,请检查 sys.avgv),2) 您可以使用 json.loads 解析字符串,甚至将其指定为参数 @987654333 @函数。 你的 shell 引用在我看来是错误的。 (为什么你以b 开头?为什么你的-a 参数在单个字符串中?)此外,field1field2 让我感到困惑。如果它们需要是动态的,只需将它们作为 JSON 的一部分(它们目前不使用正确的语法)。如果它们是静态的,则将您的ArgumentParser 更改为分别采用--field1--field2。部分问题似乎是您试图同时做太多不同的事情。 【参考方案1】:

看来你的 json 格式不正确。

尝试使用 Hjson 库:

https://hjson.github.io/

import hjson

 ...

hjson.loads(yourText);

【讨论】:

demjson Lib 也能做到这一点

以上是关于字符串内的 JSON 的 argparse的主要内容,如果未能解决你的问题,请参考以下文章

Python argparse 与 stdin 互斥是选项之一

iPhone JSON框架不解析不在对象或数组内的JSON字符串对象

如何将form内的表单序列化为json字符串

正则表达式替换 JSON 对象内的字符串

Argparse 在 `choice` 参数中间吃掉任意字符串

Python argparse 参数:传递包含连字符的字符串的问题