2017-11-22 21 views
1

python2でロードするjson形式の文字列がありますが、json.loads()の場合はエラーになります。 jsonでブレースエスケープを処理する方法

{"api":"wdetail","v":"5.0","ret":["100"],"data":{"apiStack":[{"name":"esi","value":"{\"api\":\"com.aaa.detail\",\"v\":\"1.0\",\"ret\":[\"11\"]}"}]}}

JSON文字列上の負荷が、それは誤りプロンプトが表示されます

ValueError: Expecting , delimiter: line 1 column 87 (char 86)は、私は引用符を削除する場合は引用符が "value":"{\"api\"でブレースの前に、JSONの負荷が動作するため、つまり見つかりました。最初の文字列について

{"api":"wdetail","v":"5.0","ret":["100"],"data":{"apiStack":[{"name":"esi","value":{\"api\":\"com.aaa.detail\",\"v\":\"1.0\",\"ret\":[\"11\"]}}]}}

は、どのように私はそれをサポートするためにjson.loadsを求めることができます。さもなければ、私は退屈な一つずつ引用符を取り除く必要がある。

+0

使用している正確な文字列リテラル(好ましくはMCVE)を確認できますか?もしあなたが 'r'''文字列で持っていたものをラップすると、うまくいくはずです。これを実際の他の入力からテストしていますか、または文字列を手動で入力するだけですか? –

答えて

1

あなたはあなたの最初の文字列から"{}"を削除するstr.replace()を使用することができます。私たちはjson.loadsについて話しているので(

new_s = s.replace('"{', '{').replace('}"', '}') # s is your first string here 
data = json.loads(new_s) 
+0

確かにそれはうまくいきますが、キー "値"の値が引用符で始まるのはなぜかと思います。それは実際のオブジェクトではなく文字列値であるはずですか?この提案は値をJSONオブジェクトとして解析し、文字列ではなく、意図したものではないかもしれません。 – Robin

+0

いいえ、それは文字列であるはずです。文字列のソースか、この段階の前の処理から来るでしょう。 – ettanany

+0

この文字列は別の出力から得られたものであり、置換は解決策である可能性があります。文字列内に実数がある場合、置換は何か問題になります。 –

1

)を使用すると、ファイルを読んでいることを意味します。 あなたはbashのと驚くほどのsed

sed -i 's/"{/{/g' filename.json && sed -i 's/}"/}/g' filename.json 

でそうすることができますし、非常にクールたいことがあれば、あなたも生地のスクリプトを使用することができます!

+1

'json.loads'はファイル(' .load'となります)ではなく、 'a \' \ 'str \' \ '、\' \ 'バイト\ '\'または\ '\' byearear \ '\'インスタンス '。誰かにbashコマンドを提供しても、PythonでJSONを解析したい場合は役に立ちません。 –

+1

特定の質問では、「私は退屈な引用符を1つずつ削除する必要があります」と言います。彼のソースはreadでオープンされ、json.loadsに渡されたが、無効な構文のためにloads()の不平があるfile.jsonであることがわかります。ですから、bashを使って対処するのはなぜですか?なぜなら、Pythonの実行前にすべてのjsonファイルを修正し、そのパフォーマンスを向上させるためのfabric.pyスクリプトを生成することで対処できるからです。 – MinasA1

+0

質問はどこにでもファイルを言及していません。 JSONファイルを読んでいるなら、ロードの代わりに '.load'を使用します。あなたがファイルを扱っていると仮定することはできません。これは、API、Pythonの別の関数、または別のプログラムから来ている可能性があります。 "JSON ** string **"という質問があることに注意してください。 –

関連する問題