我正在尝试将JSON对象作为参数传递给python2脚本,它可以工作,但最终的json数据具有将对象括起来的单引号(')。
下面是我的代码
import json
import sys
print sys.argv[1]
data_str = sys.argv[1].decode('string-escape')
print data_str
# The above print's fine with no single quotes
json_data= {
"server-name": "servername",
"transaction-id": "transaction_id",
"user-id": "user_id",
"change-id": "change_id",
"consumer-name": "consumer_name",
"platform": "platform",
"cookbooks": [
{
"cookbook-name": "cookbook_name",
"cookbook-version": "cookbook_version",
"recipe-name": "receipie_name",
"attributes": {
}
}
]
}
json_data["cookbooks"][0]["attributes"] = data_str.decode('string-escape')
print json_data["cookbooks"]
执行
C:\Python26\python.exe saver.py "{apple:newf,mango:newb}"
{apple:newf,mango:newb}
{apple:newf,mango:newb}
[{'cookbook-name': 'cookbook_name', 'cookbook-version': 'cookbook_version', 'recipe-name': 'receipie_name', 'attributes': '{apple:newf,mango:newb}'}]
从上面的输出中,最终的json_data在属性值中包含引号 '属性':' {apple:newf,mango:newb} ',这导致我的GET调用出错。 如何转义单引号。 ?
答案 0 :(得分:2)
如果我错了,请原谅我,但我认为您在转换参数字符串类型和解码json字符串时感到困惑。
结果中的单引号表示整个值是一个字符串。
首先,您在命令行中传递的参数不是有效的JSON。
尝试像这样启动程序:
C:\Python26\python.exe saver.py "{\"apple\":\"newf\",\"mango\":\"newb\"}"
然后再像这样对字符串中包含的JSON进行解码:
json_data["cookbooks"][0]["attributes"] = json.loads(data_str)
即json.loads而非str.decode
此时,变量“ json_data”未保存JSON,而是保存了字典
然后,您将不得不对整个json_data进行编码,以通过HTTP GET的原始格式传递它,除非您有一些API可以为您完成此操作。
encoded_json_data = json.dumps(json_data)
答案 1 :(得分:0)
如果要使用JSON,请使用Python内置的json
模块。不要尝试通过将其视为不存在的Python字符串数据来弄乱问题。
import json
然后:
json_data["cookbooks"][0]["attributes"] = json.loads(sys.argv[1])
然后,如果您要将Python数据结构输出为json:
print(json.dumps(json_data["cookbook"]))