在python中获取非字符串值作为json键

时间:2016-08-10 06:41:33

标签: python json dictionary

我正在我的django项目中使用“ODK”整合。

我从django视图中的响应(request.body)获取了一个json格式,其中所有键都是非字符串的。 例如:

{
   key1 : "value1",
   key2 : "value2"
}

由于其中的键是非字符串我不知道如何访问json中的值。我需要知道这个json的类型以及如何进行它以将json转换为字典。

这是json文件:

{

token: "testauthtoken",
content: "record",
formId: "maintenance_ct",
formVersion: "",

}

1 个答案:

答案 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 );