カンマの代わりにセミコロンを1にテキストストリームを変換するためのPython tokenize
moduleを使用してください。 Pythonトークナイザは、セミコロンを含めてもJSON入力を扱うことができます。トークナイザは全体のトークンとして文字列を提示し、「生の」セミコロンを使用して、交換するための単一token.OP
トークンとしてストリームにあります
import tokenize
import json
corrected = []
with open('semi.json', 'r') as semi:
for token in tokenize.generate_tokens(semi.readline):
if token[0] == tokenize.OP and token[1] == ';':
corrected.append(',')
else:
corrected.append(token[1])
data = json.loads(''.join(corrected))
これはあなたが交換したらフォーマットが有効なJSONになっていることを前提としていセミコロンはカンマで区切ります。例えば末尾にカンマがない場合は、末尾にカンマを付けてください。]
または}
が許可されていますが、最後に追加されたカンマも追跡できます。
デモ:
>>> import tokenize
>>> import json
>>> open('semi.json', 'w').write('''\
... {
... "client" : "someone";
... "server" : ["s1"; "s2"];
... "timestamp" : 1000000;
... "content" : "hello; world"
... }
... ''')
>>> corrected = []
>>> with open('semi.json', 'r') as semi:
... for token in tokenize.generate_tokens(semi.readline):
... if token[0] == tokenize.OP and token[1] == ';':
... corrected.append(',')
... else:
... corrected.append(token[1])
...
>>> print ''.join(corrected)
{
"client":"someone",
"server":["s1","s2"],
"timestamp":1000000,
"content":"hello; world"
}
>>> json.loads(''.join(corrected))
{u'content': u'hello; world', u'timestamp': 1000000, u'client': u'someone', u'server': [u's1', u's2']}
間トークンの空白が削除されたが、tokenize.NL
トークンと各トークンの一部であり(lineno, start)
と(lineno, end)
位置タプルに着目して再instatedすることができます。トークンの周りの空白はJSONパーサーにとって重要ではないので、私はこれを気にしませんでした。
はどのような醜態がために来たのか? –
は常に ';'で区切られています。 – Julien
JSONのオブジェクトは1つだけですか? –