在过去的几个小时里,我一直在努力将字符串变成JSON字典。我已尝试过json.loads中的所有内容(...会抛出错误:
requestInformation = json.loads(entry["request"]["postData"]["text"])
//throws this error
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes:
使用re.sub('\\','',mystring),mystring.sub(......无效)来删除斜杠。我的问题字符串看起来像这样
'{items:[{n:\\'PackageChannel.GetUnitsInConfigurationForUnitType\\',ps:[{n:\\'unitType\\',v:"ActionTemplate"}]}]}'
此字符串的来源是它是Google Chrome的HAR转储。我认为那些反斜杠来自于它在途中的某个地方被转义,因为大部分HAR文件不包含它们,但它们确实出现在任何标记为“text”的字段中。
"postData": {
"mimeType": "application/json",
"text": "{items:[{n:'PackageChannel.GetUnitsInConfigurationForUnitType',ps:[{n:'unitType',v:\"Analysis\"}]}]}"
}
编辑我最终放弃了将上面的文字转换为JSON,而是选择了正则表达式。有时候斜线出现了,有时它们并不是基于我查看文本的内容而且很难使用。
答案 0 :(得分:0)
json
模块需要一个字符串,其中键也用双引号
所以下面的字符串可以工作:
mystring = '{"items":[{"n":"PackageChannel.GetUnitsInConfigurationForUnitType", "ps":[{"n":"unitType","v":"ActionTemplate"}]}]}'
myjson = json.loads(mystring)
此函数应删除双反斜杠并在键周围加上双引号。
import json, re
def make_jsonable(mystring):
# we'll use this regex to find any key that doesn't contain any of: {}[]'",
key_regex = "([\,\[\{](\s+)?[^\"\{\}\,\[\]]+(\s+)?:)"
mystring = re.sub("[\\\]", "", mystring) # remove any backslashes
mystring = re.sub("\'", "\"", mystring) # replace single quotes with doubles
match = re.search(key_regex, mystring)
while match:
start_index = match.start(0)
end_index = match.end(0)
print(mystring[start_index+1:end_index-1].strip())
mystring = '%s"%s"%s'%(mystring[:start_index+1], mystring[start_index+1:end_index-1].strip(), mystring[end_index-1:])
match = re.search(key_regex, mystring)
return mystring
我无法在您编写的第一个字符串上直接测试它,双/单引号不匹配,但在最后一个代码示例中它可以正常工作。
答案 1 :(得分:-1)
您需要在JSON字符串之前使用r,或者将所有\替换为\\
这有效:
import json
validasst_json = r'''{
"postData": {
"mimeType": "application/json",
"text": "{items:[{n:'PackageChannel.GetUnitsInConfigurationForUnitType',ps:[{n:'unitType',v:\"Analysis\"}]}]}"
}
}'''
txt = json.loads(validasst_json)
print(txt["postData"]['mimeType'])
print(txt["postData"]['text'])