From e1eee6e3caa282a3ef73db5ac2f37c852522d1dc Mon Sep 17 00:00:00 2001 From: Dylan Schooner Date: Thu, 18 Dec 2025 13:33:13 -0500 Subject: [PATCH] Add Json::parseUntilMalformed helper Signed-off-by: Dylan Schooner --- launcher/Json.cpp | 11 +++++++++++ launcher/Json.h | 3 +++ .../minecraft/mod/tasks/LocalDataPackParseTask.cpp | 10 ++-------- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/launcher/Json.cpp b/launcher/Json.cpp index dd7287e00..7c6d82325 100644 --- a/launcher/Json.cpp +++ b/launcher/Json.cpp @@ -101,6 +101,17 @@ QJsonArray requireArray(const QJsonDocument& doc, const QString& what) return doc.array(); } +QJsonDocument parseUntilMalformed(const QByteArray& json, QJsonParseError* error) +{ + auto doc = QJsonDocument::fromJson(json, error); + if (error->error != QJsonParseError::NoError) { + QByteArray validJson = json.left(error->offset); + doc = QJsonDocument::fromJson(validJson, error); + } + + return doc; +} + void writeString(QJsonObject& to, const QString& key, const QString& value) { if (!value.isEmpty()) { diff --git a/launcher/Json.h b/launcher/Json.h index 8a994d7bc..35a5b655b 100644 --- a/launcher/Json.h +++ b/launcher/Json.h @@ -107,6 +107,9 @@ QJsonArray toJsonArray(const QList& container) ////////////////// READING //////////////////// +// Attempt to parse JSON up until unexpected data is encountered +QJsonDocument parseUntilMalformed(const QByteArray& json, QJsonParseError* error = nullptr); + /// @throw JsonException template T requireIsType(const QJsonValue& value, const QString& what = "Value"); diff --git a/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp index 97e441032..81c561f27 100644 --- a/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp @@ -169,15 +169,9 @@ bool processZIP(DataPack* pack, ProcessingLevel level) bool processMCMeta(DataPack* pack, QByteArray&& raw_data) { QJsonParseError parse_error; - auto json_doc = QJsonDocument::fromJson(raw_data, &parse_error); + auto json_doc = Json::parseUntilMalformed(raw_data, &parse_error); if (parse_error.error != QJsonParseError::NoError) { - QByteArray validJson = raw_data.left(parse_error.offset); - json_doc = QJsonDocument::fromJson(validJson, &parse_error); - - if (parse_error.error != QJsonParseError::NoError) { - qWarning() << "Failed to parse JSON:" << parse_error.errorString(); - return false; - } + qWarning() << "Failed to parse JSON:" << parse_error.errorString(); } try {