【发布时间】:2025-12-01 00:40:01
【问题描述】:
试图将包含 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参数在单个字符串中?)此外,field1和field2让我感到困惑。如果它们需要是动态的,只需将它们作为 JSON 的一部分(它们目前不使用正确的语法)。如果它们是静态的,则将您的ArgumentParser更改为分别采用--field1和--field2。部分问题似乎是您试图同时做太多不同的事情。