Przetwarzaj podciąg jako JSON za pomocą QJsonDocument

Mam sznurek, któryzawiera (niejest) Dane zakodowane w JSON, jak w tym przykładzie:

foo([1, 2, 3], "some more stuff")
    |        |
  start     end   (of JSON-encoded data)

Kompletny język, którego używamy w naszej aplikacji, zagnieżdża dane zakodowane w JSON, podczas gdy reszta języka jest banalna (po prostu rekurencyjne). Podczas analizowania ciągów takich jak ten od lewej do prawej w parserze rekurencyjnym, wiem, kiedy napotykam wartość zakodowaną w JSON, jak tutaj[1, 2, 3] zaczynając od indeksu 4. Po przeanalizowaniu tego podciągu, muszę znać pozycję końcową, aby kontynuować analizowanie reszty łańcucha.

Chciałbym przekazać ten podciąg do sprawdzonego parsera JSON, takiego jakQJsonDocument w Qt5. Ale jak czytaniedokumentacja, nie ma możliwości przeanalizowania tylko podłańcucha jako JSON, co oznacza, że ​​gdy tylko przeanalizowane dane się zakończą (po zużyciu] tutaj) kontrola powraca bez zgłaszania błędu analizy. Ponadto muszę znać pozycję końcową, aby kontynuować analizowanie własnych rzeczy (tutaj pozostały ciąg, "some more stuff")).

Aby to zrobić, użyłem niestandardowego parsera JSON, który pobiera bieżącą pozycję przez odniesienie i aktualizuje ją po zakończeniu analizowania. Ale ponieważ jest to kluczowa dla bezpieczeństwa część aplikacji biznesowej, nie chcemy już dłużej trzymać się mojego samodzielnie opracowanego parsera. To znaczy jestQJsonDocument, więc czemu go nie używać. (Używamy już Qt5.)

Zastanawiam się nad tym podejściem:

PozwolićQJsonDocument przeanalizuj podłańcuch zaczynając od bieżącej pozycji (która nie jest prawidłowym JSON)Błąd zgłasza niespodziewaną postać, jest to pozycja poza JSONPozwolićQJsonDocument parsuj ponownie, ale tym razem podciąg z poprawną pozycją końcową

Drugim pomysłem jest napisanie „skanera końcowego JSON”, który pobiera cały łańcuch, pozycję początkową i zwraca pozycję końcową danych zakodowanych w JSON. Wymaga to również parsowania, ponieważ niedopasowane nawiasy / nawiasy mogą pojawić się w wartościach łańcuchowych, ale znacznie łatwiej (i bezpieczniej) jest pisać (i używać) taką klasę w porównaniu z w pełni ręcznie wykonanym parserem JSON.

Czy ktoś ma lepszy pomysł?

questionAnswers(1)

yourAnswerToTheQuestion