0

変更できない外部プロセスからの JSON が渡されました。下流の Java プロセスが機能するには、この JSON 文字列を変更する必要があります。JSON 文字列は次のようになります。

{"widgets":"blah","is_dog":"1"}

ただし、次のようにする必要があります。

{"widgets":blah,"is_dog":"1"}

の周りの引用符を削除する必要がありますblah。実際にblahは、巨大な JSON オブジェクトなので、この質問のために単純化しました。そこで、 の前と後に 1 つString#replaceずつ、2 つの呼び出しを行うことで問題を解決しようと考えました。blah

dataString = dataString.replaceAll("{\"widgets\":\"", "{\"widgets\":");
dataString = dataString.replaceAll("\",\"is_dog\":\"1\"}", ",\"is_dog\":\"1\"}");

これを実行すると、あいまいな実行時エラーが発生します。

違法な繰り返し

正規表現のマエストロは、私が間違っている場所を見つけることができますか? 前もって感謝します。

4

5 に答える 5

1

{}正規表現では特別な意味があります。彼らはパターンの許可された繰り返しに言及することです。だから彼らはここで逃げるべきです。

\\{\"widgets\":\"", "\\{\"widgets\":の代わりに使用し{\"widgets\":\"", "{\"widgets\":ます。

于 2013-02-15T12:42:25.613 に答える
1

正規表現を使用するよりも、 JSONObjectのコードを取得してメソッドを変更しtoString()て、これをより信頼性の高い変換にする方がよいのではないかと思います。これがソースコードでquote()、メソッドの呼び出しを探しています

于 2013-02-15T12:43:37.580 に答える
1

中括弧をエスケープする必要があると思います。中括弧は繰り返しに使用されます ( (foo){3}foo を 3 回続けて検索します)。したがって、エラー。

注: この場合、ダブル エスケープする必要があります: \\{

于 2013-02-15T12:41:50.403 に答える
1

入力文字列は有効な json のように見えるため、実際のパーサーを使用してマップのような構造に解析することをお勧めします。正規表現はこれに適したツールではありません。この構造を json ではないものにシリアライズするのは比較的簡単です。

于 2013-02-15T12:45:56.677 に答える
0

では、単純に次のことをしてみませんか?

1) 最初の JSON (引用符付きで正しい) を次のようにデコードします。varJSON1

2)文字列「何とか」を取得 varJSON1しますvarJSON2

3) 次に、varJSON2

于 2013-02-15T12:44:29.893 に答える