この例のように、JSON でエンコードされたデータを含む(ではない)文字列があります。
foo([1, 2, 3], "some more stuff")
| |
start end (of JSON-encoded data)
アプリケーションで使用する完全な言語は、JSON でエンコードされたデータをネストしますが、言語の残りの部分は簡単です (再帰的なものだけです)。このような文字列を再帰パーサーで左から右に解析するとき、ここ[1, 2, 3]
ではインデックス 4 から始まるように、JSON でエンコードされた値に遭遇したことを知っています。この部分文字列を解析した後、残りを解析し続けるために終了位置を知る必要があります。文字列の。
QJsonDocument
この部分文字列をQt5のような十分にテストされた JSON パーサーに渡したいと思います。しかし、ドキュメントを読むと、部分文字列のみを JSON として解析する可能性はありません。つまり、解析されたデータが終了するとすぐに (]
ヒアを消費した後)、制御は解析エラーを報告せずに戻ります。また、自分自身のものを解析し続けるには、終了位置を知る必要があります (ここでは、残りの文字列は です, "some more stuff")
)。
これを行うために、私はカスタム JSON パーサーを使用していました。このパーサーは、参照によって現在の位置を取得し、解析の終了後にそれを更新します。しかし、これはビジネス アプリケーションのセキュリティ上重要な部分であるため、自作のパーサーにこれ以上固執したくはありません。あるということなQJsonDocument
ので、使ってみませんか。(私たちはすでに Qt5 を使用しています。)
回避策として、私はこのアプローチを考えています:
QJsonDocument
現在の位置から始まる部分文字列を解析しましょう(これは有効な JSON ではありません)- エラーは予期しない文字を報告します。これは JSON を超えた位置です
- 再度
QJsonDocument
解析しますが、今回は正しい終了位置を持つ部分文字列です
2 番目のアイデアは、文字列全体、開始位置を取得し、JSON エンコードされたデータの終了位置を返す「JSON 終了スキャナー」を作成することです。一致しない括弧/括弧が文字列値に表示される可能性があるため、これには解析も必要ですが、完全に手作りの JSON パーサーと比較して、そのようなクラスを作成 (および使用) する方がはるかに簡単 (かつ安全) です。
誰かがより良いアイデアを持っていますか?