2016-07-05 88 views
0

在过去的几个小时里,我一直在争取得到一个字符串转换成JSON字典。我从json.loads(什么都试过了...这将引发一个错误:的Python:不能把字符串转换成JSON

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"}]}]}' 

此字符串的起源是,它是从谷歌浏览器HAR转储。我认为这些反斜线正从中沿着逃脱某处这样,因为HAR文件的大部分内容不包含他们,但他们在标有“文本”任何领域中常用的出现。

"postData": { 
     "mimeType": "application/json", 
     "text": "{items:[{n:'PackageChannel.GetUnitsInConfigurationForUnitType',ps:[{n:'unitType',v:\"Analysis\"}]}]}" 
} 

编辑我最终放弃了将上面的文本转换为JSON,而是选择了正则表达式。有时会出现斜线,有时它们不是基于我正在查看文本的内容,因此难以处理。

+0

这是有效的JavaScript对象,但无效的json和无效的python字典。 http://json.org,可能会发现松散的json解析器。 – YOU

+0

错误是不是反斜杠顺便说一句,它是抱怨键不双引号 – YOU

+0

与正则表达式 '重' 模块,'>>> json.loads(应用re.sub( '(\ W +):',R“'\ 1 “: 'a.replace(”' “” ' '))){ u'items':[{u'ps ':[{u'v':u'Analysis',u'n':U 'unitType'}],u'n':u'PackageChannel.GetUnitsInConfigurationForUnitType'}]} ' – YOU

回答

-1

你需要AR JSON字符串之前,或更换所有\与\\

这工作:

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']) 
+0

他正在解码゙text゙该对象的字段 – YOU

+0

我只是显示如何将字符串转换为JSON字典,其中他面对的是这样做的问题。 – min2bro

+0

那么它是不是答案 – YOU

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 

我不能直接测试它在你写的第一个字符串,双/单引号不匹配,但对一个它工作的最后一个代码样本。