json反序列化时只支持双引号,不支持单引号
今天在跟前端同事联调的时候发现个很奇怪的问题:明明传过来的是json类型的列表,但是在进行反序列化的时候总会上报json.decoder.JSONDecodeError!
最后终于找到了原因,这里记录一下。
我们都知道,python内置函数 repr 可以打印出数据原生的面貌,我们来看一下前端同事传过来的json数据长什么样:
是的!你没有看错!传来的字符串是双引号套着单引号!网上查了一下资料:json在进行反序列化的时候是不支持单引号的!因此我们需要将前端传过来的单引号的数据转换为双引号!
我这里写了一个方法来解决这个问题:
def replace_comma(word:str)->str: """ :param word: ['0101','0202'] :return: ["0101","0202"] """ word_p = repr(word) # "['0101','1202']" word_p = word_p.replace("'",'"') # 返回的时候:第一个跟最后一个引号不返回! return word_p[1:-1]
实际使用的时候我们可以先捕获一下异常,如果出现了异常再进行转换:
import json err = "['0101','1202']" # 模拟前端传来的双引号套单引号的数据 def replace_comma(word:str)->str: # 注意输入与返回的都是字符串!!! """ :param word: ['0101','0202'] :return: ["0101","0202"] """ word_p = repr(word) # "['0101','1202']" word_p = word_p.replace("'",'"') # 返回的时候:第一个跟最后一个引号不返回! return word_p[1:-1] try: err_lst = json.loads(err) except json.decoder.JSONDecodeError: print("发生异常啦!!!") err = replace_comma(err) err_lst = json.loads(err) print(err_lst,type(err_lst))
结果如下:
这样成功进行了json的反序列化操作。
前端进行Json序列化与反序列化的方法
JSON.parse()
parse()方法用于从一个json格式的字符串中解析出Object对象:
var str='{"name":"whw","age":"18"}' // 经 JSON.parse(str) 得到: Object : age:"18", name:"whw", proto_:Object
单引号必须写在括号外,每个属性都必须双引号引起来,否则会抛出异常!!!
JSON.stringify()
stringify()方法用于从一个对象中解析出json字符串。
var obj={a:1,b:2} // 经 JSON.stringify(obj) 解析后得到 "{"a":"1","b":"2"}"
~~~