如何解决json字符串解析失败json.decoder.JSONDecodeError

最近遇到一个json字符串解析失败的问题,原因是json里面的":这个两个符合和一些特殊符号在搞鬼,报错如下: json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: … json.decoder.JSONDecodeError: Expecting ‘,’ delimiter: … json.decoder.JSONDecodeError: Expecting ‘:’ delimiter: … 请对号入座,废话不多说,直接上代码,可以直接使用:

#coding=utf-8
import json
import re
import sys


sys.setrecursionlimit(1000000)


def deal_json_invaild(text):
    if type(text) != str:
        raise Exception("参数接受的是字符串类型")
    # text = re.search(r"{.*}", text).group()
    text = re.sub(r"
|	|
|
|

|x08|\", "", text)
    try:
        json.loads(text)
    except json.decoder.JSONDecodeError as err:
        temp_pos = int(re.search(r"(char (d+))", str(err)).group(1))
        temp_list = list(text)
        while True:
            if temp_list[temp_pos] == """ or "}":
                if temp_list[temp_pos - 1] == "{":
                    break
                elif temp_list[temp_pos - 1] == (":" or "{") and temp_list[temp_pos - 2] == (""" or ":" or "["):
                    break
                elif temp_list[temp_pos] == "|
|	|
|
|

| ":
                    temp_list[temp_pos] = re.sub(temp_list[temp_pos], "", temp_list[temp_pos])
                    text = "".join(temp_list)
                elif temp_list[temp_pos] == """:
                    temp_list[temp_pos] = re.sub(temp_list[temp_pos], "“", temp_list[temp_pos])
                    text = "".join(temp_list)
                elif temp_list[temp_pos] == "}":
                    temp_list[temp_pos - 1] = re.sub(temp_list[temp_pos], """, temp_list[temp_pos])
                    text = "".join(temp_list)
                    temp_pos -= 1
            temp_pos -= 1
        return deal_json_invaild(text)
    else:
        return text

if __name__ == __main__:
	# 测试字符串
    text = "sadasd""{""name":"张三","age":24,"电话":1008611,"地址":"中国","武当山"}""""saddsd
    a = deal_json_invaild(text)
    print(json.loads(a))

注意:测试字符串地方必须是符合json转换规则的,如:’{“name”:“张三”,“age”:24,“电话”:1008611}’,注意单引号和双引号的使用,因为网上爬取下来的字符串也是这种格式的。我再处理之前想清洗了数据,即把" | | | | |"这些给他去除掉,不然会影响json解析。

以上代码对json字符串解析失败处理方法,能解决95%以上的问题,还有5%可能自己还没遇到过奇葩字符串。之前有遇到一个非常奇怪的字符导致解析失败,就是上面代码中的:

1  text = re.sub(r"
|	|
|
|

|x08|\", "", text)
经验分享 程序员 微信小程序 职场和发展