2017-02-13 18 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

重寫該函數可能需要一個文件或文件名,但在這種情況下,如果您要修補格式錯誤的數據,最好讓事情儘可能簡單。 –