1

JSON 形式のテキストを含む UTF-8 データ ファイルからテキストを JSON オブジェクトにロードし、それを解析する必要があります。ファイルの内容や形式を制御することはできず、与えられたものに対処する必要があります。また、2.7 である Python のバージョンを制御することもできません。

このテキスト ファイルの少なくとも 1 つの値に \n が含まれています。このため、スクリプトを実行すると次のようなエラーが発生します: Expecting , delimiter: line 8 column 102 (char 470)'

ファイルの内容は次のようになります。

{
"key1": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"key2": "Suspendisse eu tincidunt velit. Proin mollis ligula a arcu feugiat ac imperdiet nunc sagittis. Etiam egestas fringilla tristique.\nCurabitur interdum dolor eu velit gravida et convallis purus facilisis. Aenean eu enim mi.",

"key3": "Nunc intérdum mågna nec nîbh faucibus non laoreet nisi blandit. Nunc lobortis ligula ut tellus semper in hendrerit mauris malesuada.",

"key4": "Vivamus erat turpis, fringilla id sollicitudin non, pellentesque vel lacus. Praesent placerat dapibus mauris vel hendrerit. Integer a augue leo, facilisis viverra dui. Maecenas sollicitudin adipiscing viverra. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam vestibulum commodo diam, vitae ultrices quam viverra eu. Proin eros sapien, scelerisque non condimentum vel, placerat at est. Ut fermentum mattis lacus, a eleifend ipsum euismod ac. Quisque mollis bibendum quam nec sollicitudin."

}

関連コード:

def processText(stringData):
    j = json.loads(data, encoding='utf-8')
    # do stuff that I can't change


dataFile = codecs.open('/path/to/file', 'r', 'utf-8')    
data = dataFile.read()
dataFile.close()
processText(data)

私は次のことを試しました:

  1. json.loads(data.replace('\n','\\n')テキスト ファイルには最大 15,000 文字が含まれているため、スクリプトがハングするだけです。
  2. json.loads("%r"%d)ここで、d は文字列を含む変数です。これにより、ファイル内のすべての改行が \n に変換されるため、「JSON オブジェクトをデコードできませんでした」というエラーが発生しますが、これは発生する必要はありません。

この文字列を JSON オブジェクトにロードするにはどうすればよいですか?

4

2 に答える 2

0

json文字列には\n(2 文字) を含めることができます。したがって、ファイルに表示されている場合\n; 大丈夫です。

有効な json (ファイルに表示されているもの (Python ソース コードではない)):

["line\nanother"]

無効:

["line
another"]

ファイルの内容を Python 文字列リテラルとして含めると、混乱が生じる可能性があります。この場合、パーサーに到達\nする前に Python によって解釈されます。jsonそれを避けるには、r''リテラルを使用します。

json_text = r'["line\nanother"]'
print(json_text) # -> ["line\nanother"]
d = json.loads(json_text)

ファイルから json を読み取る場合。何もする必要はありません (\nあと 2 バイトです。そのまま取得します):

with open(filename) as file: # don't need `codecs` if file is in utf-8
    d = json.load(file)
    # analog of: d = json.loads(file.read())
于 2013-03-22T03:35:59.340 に答える