python';s json:AttributeError:';str';对象没有属性';钥匙';
我试图加载一个字符串(实际程序从一个文件中读取这一行,它是一个非常大的文件,我无法手动修改),格式化为字典 我需要将字符串行转换为json对象,以便检查特定键的值,例如python';s json:AttributeError:';str';对象没有属性';钥匙';,python,json,python-3.x,dictionary,Python,Json,Python 3.x,Dictionary,我试图加载一个字符串(实际程序从一个文件中读取这一行,它是一个非常大的文件,我无法手动修改),格式化为字典 我需要将字符串行转换为json对象,以便检查特定键的值,例如myJson[Date] 以下是脚本: import json mystring = "{'Date': 'Fri, 19 Apr 2019 03:58:04 GMT', 'Server': 'Apache/2.4.39', 'Accept-Ranges': 'bytes'}" mystring = json.dumps(m
myJson[Date]
以下是脚本:
import json
mystring = "{'Date': 'Fri, 19 Apr 2019 03:58:04 GMT', 'Server': 'Apache/2.4.39', 'Accept-Ranges': 'bytes'}"
mystring = json.dumps(mystring)
myJson = json.loads(mystring)
print(str(myJson.keys()))
print(str(myJson))
我得到这个错误:
AttributeError: 'str' object has no attribute 'keys'
我怀疑
mystring
格式不一致,单引号应该是双引号?鉴于我有大量数据,我不能简单地使用简单搜索/替换将单冒号替换为双冒号,因为单冒号可能包含在我不应修改的值中。如果这是问题的原因,有没有办法只替换键/值对的冒号而不触及值中的冒号?我希望这不是问题所在 与其处理单引号字符串并努力将其转换为json,不如使用package将其转换为有效的dict
import ast
mystring = "{'Date': 'Fri, 19 Apr 2019 03:58:04 GMT', 'Server': 'Apache/2.4.39', 'Accept-Ranges': 'bytes'}"
my_dict = ast.literal_eval(mystring)
结果是:
> print(my_dict["Date"])
Fri, 19 Apr 2019 03:58:04 GMT
是的,json解码器喜欢对键和值使用双引号,我认为您可以使用python进行替换,如果适用,请尝试:
mystring = "{'Date': 'Fri, 19 Apr 2019 03:58:04 GMT', 'Server': 'Apache/2.4.39', 'Accept-Ranges': 'bytes'}"
json_string = mystring.replace("'", "\"")
d = json.loads(json_string)
dstring = json.dumps(d)
myJson = json.loads(dstring)
print(str(myJson.keys()))
此代码将字符串作为字典存储在名为“Tempvar”的变量中 从这个变量中,您可以像使用常规字典一样使用键
import json
mystring = "{'Date': 'Fri, 19 Apr 2019 03:58:04 GMT', 'Server': 'Apache/2.4.39', 'Accept-Ranges': 'bytes'}"
exec("tempvar = " + mystring)
mystring = json.dumps(mystring)
myJson = json.loads(mystring)
print(str(tempvar['Date']))
print(str(myJson))
希望这有帮助这行代码的作用是什么:
mystring=json.dumps(mystring)
?此外,您的字符串不是有效的JSON(单引号而不是双引号)。mystring
从何而来?看起来你把一个非常好的dict转换成了一个字符串。正确的操作过程很可能不是添加更多的处理步骤,而是删除一个较早的、不正确的步骤。如果您真的被这个字符串卡住了,您可能必须使用类似于ast.literal\u eval
或允许的JSON解析器json。dumps
绝对不是正确解决方案的一部分。mystring
一开始就不是有效的json-它需要双引号才能成为json。您已将Pythonstr
对象序列化为json字符串对象。因此,当您反序列化它时,它将是一个字符串。正如其他人所指出的,您的字符串实际上并不包含有效的JSON,但在任何情况下,您几乎肯定不是想先JSON.dumps(mystring)
。这没有任何意义。您确定mystring.replace
将只替换键/值逗号吗?值中没有任何其他逗号?replace命令将单引号替换为双引号,而不是逗号。您只能打印replace命令的结果,以查看其工作方式是的,我指的是引号。那是个打字错误。但正如我所说,值中的数据可能包含双引号。盲目地替换报价是危险的。除非有一种方法可以保证只有键/值引号被替换。哦,我明白你的担心。。。在这种特殊情况下,ast.literal_eval是一个更实用的解决方案。我的意思是,在值内部,有可能保留单引号。示例:“日期”:“2019年4月19日星期五03:58:04 GMT”
。我不应该更改19中的引号。或者可能会有双引号,例如:“Date”:“Fri”,19“Apr 2019 03:58:04 GMT”
,如果我将单引号转换为双引号,我不知道是否会导致问题?