Python:无法将字符串转换为JSON

时间:2016-07-05 01:18:47

标签: python json decode

在过去的几个小时里,我一直在努力将字符串变成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,而是选择了正则表达式。有时候斜线出现了,有时它们并不是基于我查看文本的内容而且很难使用。

2 个答案:

答案 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'])