2017-02-13 15 views
2

私は、接続文字列が含まれているJSONファイルがあります:エスケープされていないバックスラッシュでJSONファイルを読み取る方法は?

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

abc.json

は、ここでデータを読み取ろうとする私の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

ファイルが無効です:\yというJSONのエスケープシーケンスはありません。ベアバックスラッシュ自体をエスケープする必要があります。\\

最も簡単な解決策は、そのバックスラッシュをエスケープすることによって、有効な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行目(char 0)です。問題? – user3222101

+0

ファイル名を関数に渡しましたか?上記の関数は、ファイル名ではなく引数としてJSONを含む文字列を取ります。最初にファイルを開いて文字列に読み込む必要があります。 –

+0

ファイルやファイル名を取得するように関数を書き直すことは可能ですが、不正なデータにパッチを当てようとしているこのような場合は、できるだけシンプルにすることをお勧めします。 –

関連する問題