如何从带有非转义反斜杠的JSON文件中读取?

2024-10-01 17:25:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含连接字符串的JSON文件:

abc.json文件

{
  "host":"1.2.3.4",
  "user":"abc",
  "passwd":"s&]\yz$&u42/",
  "dbname":"sample",
  "port":2341
}

下面是我的Python脚本,它尝试读取数据:

^{pr2}$

它给了我一个错误:

json.decoder.JSONDecodeError: Invalid \escape: line 4 column 16 (char 53)

如何修复此错误?在


Tags: 文件sample字符串脚本jsonhostport错误
2条回答

您的文件无效:JSON中没有\y这样的转义序列,并且必须对空的反斜杠本身进行转义:\\。在

如果可以,最简单的解决方案是通过转义反斜杠来修复文件,使其成为有效的JSON。在

如果由于某些原因您无法执行此操作,则可以为json.loads()编写一个包装器来捕获此特定错误并修补源文本:

import json
from json.decoder import JSONDecodeError

def permissive_json_loads(text):
    while True:
        try:
            data = json.loads(text)
        except JSONDecodeError as exc:
            if exc.msg == 'Invalid \\escape':
                text = text[:exc.pos] + '\\' + text[exc.pos:]
            else:
                raise
        else:
            return data

为了简单起见,上面的函数使用字符串而不是文件。在

这也是一种“大锤敲碎螺母”的方法,反复尝试加载整个JSON文档,并在发现任何未被转义的反斜杠时修复它们,这对于很少有问题的小型JSON文档来说是合理的,如果你处理这些大的反斜杠的文档不太合适的话。在

这就是它的作用:

^{pr2}$

在您的例子中,您可以将文件读入一个字符串,然后调用该函数:

 dbconn = "C:\abc.json"
 with open(dbconn) as conn_file:
     conn_doc = conn_file.read()
 conn = permissive_json_loads(conn_doc)

Python>;=2.7.15似乎会产生与Python3相同的错误消息:

test = """
{
  "host":"1.2.3.4",
  "user":"abc",
  "passwd":"s&]\yz$&u42/",
  "dbname":"sample",
  "port":2341
}
"""

print json.loads(test)

错误:

ValueError: Invalid \escape: line 5 column 16 (char 54)

稍微修改@Zero Piraeus's代码可以在Python2.7下工作:

^{pr2}$

印刷品:

Replacing at position: 54
{u'passwd': u's&]\\yz$&u42/', u'host': u'1.2.3.4', u'port': 2341, u'user': u'abc', u'dbname': u'sample'}

相关问题 更多 >

    热门问题