我正在我的django项目中使用“ODK”整合。
我从django视图中的响应(request.body)获取了一个json格式,其中所有键都是非字符串的。 例如:
{
key1 : "value1",
key2 : "value2"
}
由于其中的键是非字符串我不知道如何访问json中的值。我需要知道这个json的类型以及如何进行它以将json转换为字典。
这是json文件:
{
token: "testauthtoken",
content: "record",
formId: "maintenance_ct",
formVersion: "",
}
答案 0 :(得分:1)
正如其他人所指出的,这不是有效的JSON,原因有两个:不带引号的键名和最后的逗号。
如果可能,最好的办法是修复生成此代码的服务器代码,以生成正确的JSON。也许该代码通过手动粘贴字符串来创建“JSON”?如果是这样,您可以将其更改为使用json.dumps()
。这将为您提供有效的JSON。
如果失败,您可以预处理“JSON”文本以用引号括住键名并删除尾随逗号。这可能有点脆弱,但如果您知道输入数据的格式将保持相似,那么这是一种方法:
import json, re
badJson = '''
{
token: "testauthtoken",
content: "record",
formId: "maintenance_ct",
formVersion: "",
}
'''
print( 'badJson:' )
print( badJson )
goodJson = re.sub( r'\n\s*(\S+)\s*:', r'\n"\1":', badJson )
goodJson = re.sub( r',\s*}', r'\n}', goodJson )
print( 'goodJson:' )
print( goodJson )
goodData = json.loads( goodJson )
print( 'goodData:' )
print( goodData )
打印:
badJson:
{
token: "testauthtoken",
content: "record",
formId: "maintenance_ct",
formVersion: "",
}
goodJson:
{
"token": "testauthtoken",
"content": "record",
"formId": "maintenance_ct",
"formVersion": ""
}
goodData:
{'formId': 'maintenance_ct', 'content': 'record', 'token': 'testauthtoken', 'formVersion': ''}
当我第一次写这个答案时,我误解了这个问题并提供了一个JavaScript解决方案而不是Python。如果这对任何人都有用,我会留在这里:
虽然输入文本无效JSON,但它是一个有效的JavaScript对象文字。所以你可以这样对待它并使用eval()
来解析它。事实上,这就是jQuery这样的库在不支持JSON.parse()
的旧浏览器中解析JSON的方式。
当心:您最好确定您信任此数据字符串的来源,因为您将其视为可执行代码!
// Set up a string like your input data string.
// All on one line here so we can use a string constant for testing,
// but your multiline data string will work the same.
var dataString = '{ token: "testauthtoken", content: "record", formId: "maintenance_ct", formVersion: "", }'
// Now use eval() to convert it to a JavaScript object.
// We wrap the string in parentheses so it will parse as an expression.
var data = eval( '(' + dataString + ')' );
// Finally, we can access the values.
console.log( 'token: ', data.token );
console.log( 'content: ', data.content );
console.log( 'formId: ', data.formId );
console.log( 'formVersion: ', data.formVersion );