Add Json::parseUntilMalformed helper

Signed-off-by: Dylan Schooner <dschooner05@gmail.com>
This commit is contained in:
Dylan Schooner
2025-12-18 13:33:13 -05:00
parent 43fce3ae46
commit e1eee6e3ca
3 changed files with 16 additions and 8 deletions

View File

@@ -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()) {

View File

@@ -107,6 +107,9 @@ QJsonArray toJsonArray(const QList<T>& container)
////////////////// READING ////////////////////
// Attempt to parse JSON up until unexpected data is encountered
QJsonDocument parseUntilMalformed(const QByteArray& json, QJsonParseError* error = nullptr);
/// @throw JsonException
template <typename T>
T requireIsType(const QJsonValue& value, const QString& what = "Value");

View File

@@ -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 {