json反序列化的时候字符串为单引号的一个坑

Posted 江湖乄夜雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json反序列化的时候字符串为单引号的一个坑相关的知识,希望对你有一定的参考价值。

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

~~~

以上是关于json反序列化的时候字符串为单引号的一个坑的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 Python 中反序列化带有单引号的 JSON 字符串?

反序列化包含引号和撇号的 JSON 字符串

序列化包含转义(反斜杠和双引号)的 JSON 字符串 Swift 返回格式错误的对象

聊聊fastjson反序列化的那些坑

关于requests.post().json()获取到的JSON为单引号和NONE的那些事

Django自动将文本字段中的双引号转换为单引号