1

ユーザーが編集可能な JSON 構成ドキュメントをアプリケーションのディクショナリにロードする必要がある状況があります。

問題を引き起こす特定のシナリオの 1 つは、次のような Windows UNC パスです。

\\server\share\file_path

したがって、これに対する有効な JSON は直感的に次のようになります。

{"foo" : "\\\server\\share\\file_path"}

ただし、これは無効です。

これでぐるぐる回ります。ここにいくつかの試行があります:

# starting with a json string
>>> x = '{"foo" : "\\\server\\share\\file_path"}'
>>> json.loads(x)
ValueError: Invalid \escape: line 1 column 18 (char 18)

# that didn't work, let's try to reverse engineer a dict that's correct
>>> d = {"foo":"\\server\share\file_path"}
>>> d["foo"]
'\\server\\share\x0cile_path'

# good grief, where'd my "f" go?

まとめ

  • \\server\share\file_pathを含む適切な形式の JSON ドキュメントを作成するにはどうすればよいですか?
  • その文字列を正確な値を返す辞書にロードするにはどうすればよいですか?
4

1 に答える 1

1

文字列リテラルでサポートされているエスケープ シーケンスに遭遇しています。生の文字列を使用すると、これはより明確になります。

>>> d = {"foo":"\\server\share\file_path"}
>>> d
{'foo': '\\server\\share\x0cile_path'}
>>> d = {"foo": r"\\server\share\file_path"}
>>> d
{'foo': '\\\\server\\share\\file_path'}
>>> import json
>>> json.dumps(d)
'{"foo": "\\\\\\\\server\\\\share\\\\file_path"}'
>>> with open('out.json', 'w') as f: f.write(json.dumps(d))
... 
>>> 
$ cat out.json 
{"foo": "\\\\server\\share\\file_path"}

生の文字列がなければ、「すべてをエスケープする必要があります!」

>>> d = {"foo":"\\server\share\file_path"}
>>> d
{'foo': '\\server\\share\x0cile_path'}
>>> d = {"foo":"\\\\server\\share\\file_path"}
>>> d
{'foo': '\\\\server\\share\\file_path'}
>>> print d['foo']
\\server\share\file_path
于 2013-10-08T18:37:54.890 に答える