{"record":{"id":"406b368ad27b6cb5","repo":"apache/pulsar","slug":"failed-to-parse-package-metadata-as-json-messag","errorCode":null,"errorMessage":"Failed to parse package metadata as JSON: ${message}","messagePattern":"Failed to parse package metadata as JSON: (.+?)","errorType":"exception","errorClass":"MetadataFormatException","httpStatus":null,"severity":"error","filePath":"pulsar-package-management/core/src/main/java/org/apache/pulsar/packages/management/core/common/PackageMetadataUtil.java","lineNumber":98,"sourceCode":"        if (firstNonWhitespace >= 0 && bytes[firstNonWhitespace] == JSON_LEADING_BYTE) {\n            return readJson(bytes);\n        }\n        if (bytes.length >= 2 && bytes[0] == JAVA_MAGIC_BYTE_0 && bytes[1] == JAVA_MAGIC_BYTE_1) {\n            if (!allowLegacyJavaSerialization) {\n                throw new MetadataFormatException(\n                        \"Package metadata is in legacy Java serialization format but reading it is disabled. \"\n                                + \"Enable packagesManagementAllowLegacyJavaSerialization or re-upload the package.\");\n            }\n            return readLegacy(bytes);\n        }\n        throw new MetadataFormatException(\"Unrecognized package metadata format\");\n    }\n\n    private static PackageMetadata readJson(byte[] bytes) throws MetadataFormatException {\n        try {\n            return JSON_READER.readValue(bytes);\n        } catch (IOException e) {\n            throw new MetadataFormatException(\"Failed to parse package metadata as JSON: \" + e.getMessage());\n        }\n    }\n\n    private static PackageMetadata readLegacy(byte[] bytes) throws MetadataFormatException {\n        try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) {\n            ois.setObjectInputFilter(LEGACY_FILTER);\n            Object o = ois.readObject();\n            if (!(o instanceof PackageMetadata)) {\n                throw new MetadataFormatException(\"Unexpected metadata type: \"\n                        + (o == null ? \"null\" : o.getClass().getName()));\n            }\n            if (LEGACY_READ_WARNED.compareAndSet(false, true)) {\n                log.warn(\"Read a package metadata entry in the legacy Java serialization format. \"\n                        + \"Re-upload packages or call updateMeta to migrate them to JSON, then disable \"\n                        + \"packagesManagementAllowLegacyJavaSerialization.\");\n            }\n            return (PackageMetadata) o;\n        } catch (MetadataFormatException e) {","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-package-management/core/src/main/java/org/apache/pulsar/packages/management/core/common/PackageMetadataUtil.java#L80-L116","documentation":"MetadataFormatException thrown by PackageMetadataUtil.readJson when Jackson fails to parse the payload as PackageMetadata JSON; the message includes the underlying IOException message. The bytes looked like JSON (leading '{') but were not valid or did not match the schema.","triggerScenarios":"fromBytes detecting a JSON-leading byte and calling readJson on malformed JSON, truncated JSON, or JSON with fields incompatible with PackageMetadata (wrong types, unknown structure).","commonSituations":"Hand-edited or partially-written metadata blobs, a writer from a different/incompatible version storing a different JSON shape, or corruption during storage/migration.","solutions":["Re-upload the package to rewrite valid JSON metadata.","Validate the stored blob is well-formed JSON and matches PackageMetadata fields (description, contact, properties, etc.).","Check the message suffix for the exact Jackson parse error (line/column or field mismatch).","Compare the writer version that produced the blob; migrate blobs written by incompatible versions."],"exampleFix":"// before\n{\"description\": \"pkg\",  // truncated JSON\n// after\n{\"description\":\"pkg\",\"contact\":\"dev@example.com\",\"properties\":{}}","handlingStrategy":"try-catch","validationCode":"// cheap pre-check that payload is plausible JSON before deep parse\nif (bytes == null || bytes.length == 0 || bytes[0] != '{') {\n    throw new IllegalArgumentException(\"payload is not JSON package metadata\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    PackageMetadata m = PackageMetadataUtil.fromBytes(bytes, allowLegacy);\n} catch (MetadataFormatException e) {\n    if (e.getMessage() != null && e.getMessage().startsWith(\"Failed to parse package metadata as JSON\")) {\n        // log full blob (or hash), re-upload or restore from backup\n    }\n}","preventionTips":["Round-trip test PackageMetadata JSON in CI to catch schema drift.","Keep metadata JSON schema stable across versions; migrate explicitly when it changes.","Log the Jackson error suffix (line/column/field) when parsing fails.","Protect against partial writes with atomic upload of metadata blobs."],"tags":["deserialization","json","parse-error","packages"],"backgroundTag":"json-parse-error","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}