2017-02-13 59 views
2

我有一个包含一个连接字符串JSON文件:如何从未使用反斜杠的JSON文件读取数据?

abc.json

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

这里是我的Python脚本尝试读取数据:

import psycopg2 as pg 
dbconn = "C:\abc.json" 
with open(dbconn) as conn_file: 
    conn = json.load(conn_file) 

它给我此错误:

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

我该如何解决这个错误?

+0

顺便说.. 。如果这是一个真正的密码,你会想马上改变它。 –

+0

这是一个错误的密码,所以它很好! – user3222101

回答

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文档来说是合理的,但如果您正在处理大量JSON文档以及大量这些未反转的反斜杠错误,则不太合适。

这是在行动:

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

>>> config = permissive_json_loads(text) 
>>> print(config['passwd']) 
s&]\yz$&u42/ 

在你的情况,你会从你的文件转换成字符串读取,并调用该函数:

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

感谢您的支持!我已经尝试将内容存储在文本文件中,并通过此运行导致一个错误:son.decoder.JSONDecodeError:期望值:第1行第1(char 0),请你建议如果我从文件中读取将是一个问题? – user3222101

+0

你有没有把文件名传给函数?上面的函数将包含JSON的字符串作为参数,而不是文件名。您需要先打开并将该文件读取到一个字符串中。 –

+0

重写该函数可能需要一个文件或文件名,但在这种情况下,如果您要修补格式错误的数据,最好让事情尽可能简单。 –