python中json与str转换和出现KeyError的解决方法

  • json转str
  • str转json
  • KeyError的解决方法


json转str

json格式的数据其实就是dict类型的数据,如图所示:

python 将json转为 接口 python json转str_json


使用json包下的dumps方法把dict类型的数据转化为str类型,如图所示:

python 将json转为 接口 python json转str_python 将json转为 接口_02


从输出的结果可以看出,中文被转换成了ascii码,点开dump函数可以看到有一个参数ensure_ascii默认为True:

python 将json转为 接口 python json转str_json_03


将ensure_ascii改为False就可以了:

python 将json转为 接口 python json转str_json_04


dump保存数据到文件:

python 将json转为 接口 python json转str_数据_05


在终端查看保存的文件,发现格式有点乱,不好看

python 将json转为 接口 python json转str_数据_06


通过jq,可以格式化json数据,并且还会高亮显示,如图所示:

安装jq只需要sudo apt-get install jq就可以了。

python 将json转为 接口 python json转str_python 将json转为 接口_07

str转json

先打开文件读取数据:

python 将json转为 接口 python json转str_json_08


现在获取到的数据就是str类型的,使用loads把它转换成dict类型:

python 将json转为 接口 python json转str_python 将json转为 接口_09


取json格式里的数据就是按照字典的方式:

python 将json转为 接口 python json转str_python 将json转为 接口_10

KeyError的解决方法

当我们取的key在dict中不存在时,就会报KeyError的错误,

python 将json转为 接口 python json转str_数据_11


你也许会问,我怎么会犯这种错误呢,其实在开发中难免会遇到这种问题,因为当你调用一个接口时,它会根据类型返回不同结构的json数据,你就要避免这种错误,如图:

python 将json转为 接口 python json转str_python 将json转为 接口_12


上图是调用olami接口返回的数据,可以看出,不同的type,它的json结构也是不同的,key也是不同的。

方法一:通过一些共有的key判断

python 将json转为 接口 python json转str_解决方法_13


方法二:先测试key是否存在,再操作

python 将json转为 接口 python json转str_python 将json转为 接口_14


python 将json转为 接口 python json转str_数据_15


方法三:利用dict内置的get(key[,default])

python 将json转为 接口 python json转str_解决方法_16


当key存在时,返回key对应的值,当key不存在时返回None,也可以自定义返回值:

python 将json转为 接口 python json转str_python 将json转为 接口_17


方法四:利用dict内置的setdefault(key[,default])

如果key存在,则返回其value;否则插入此key,其value为default,并返回default:

python 将json转为 接口 python json转str_数据_18


python 将json转为 接口 python json转str_KeyError_19


方法五:向类dict增加__missing__()

当key不存在时,会转向__missing__()方法处理,而不触发KeyError:

python 将json转为 接口 python json转str_解决方法_20


方法六:利用collections.defaultdict(default_factory)对象

实际上这个是继承自dict,而且实际也是用到的__missing__()方法,其default_factory参数就是向__missing__()方法传递的:

python 将json转为 接口 python json转str_KeyError_21


default_factory还可以是某种数据类型,但是不可以为None:

python 将json转为 接口 python json转str_数据_22