5

この例のように、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 パーサーと比較して、そのようなクラスを作成 (および使用) する方がはるかに簡単 (かつ安全) です。

誰かがより良いアイデアを持っていますか?

4

1 に答える 1