{"record":{"id":"8c072fe453f7cdb8","repo":"hyperledger/fabric","slug":"could-not-unmarshal-s-as-json","errorCode":null,"errorMessage":"could not unmarshal %s as json","messagePattern":"could not unmarshal (.+?) as json","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/chaincode/persistence/chaincode_package.go","lineNumber":316,"sourceCode":"\t\t\treturn ccPackageMetadata, nil, errors.Wrapf(err, \"error inspecting next tar header\")\n\t\t}\n\n\t\tif header.Typeflag != tar.TypeReg {\n\t\t\treturn ccPackageMetadata, nil, errors.Errorf(\"tar entry %s is not a regular file, type %v\", header.Name, header.Typeflag)\n\t\t}\n\n\t\tfileBytes, err := io.ReadAll(tarReader)\n\t\tif err != nil {\n\t\t\treturn ccPackageMetadata, nil, errors.Wrapf(err, \"could not read %s from tar\", header.Name)\n\t\t}\n\n\t\tswitch header.Name {\n\n\t\tcase MetadataFile:\n\t\t\tccPackageMetadata = &ChaincodePackageMetadata{}\n\t\t\terr := json.Unmarshal(fileBytes, ccPackageMetadata)\n\t\t\tif err != nil {\n\t\t\t\treturn ccPackageMetadata, nil, errors.Wrapf(err, \"could not unmarshal %s as json\", MetadataFile)\n\t\t\t}\n\n\t\tcase CodePackageFile:\n\t\t\tcodePackage = fileBytes\n\t\tdefault:\n\t\t\tlogger.Warningf(\"Encountered unexpected file '%s' in top level of chaincode package\", header.Name)\n\t\t}\n\t}\n\n\tif codePackage == nil {\n\t\treturn ccPackageMetadata, nil, errors.Errorf(\"did not find a code package inside the package\")\n\t}\n\n\tif ccPackageMetadata == nil {\n\t\treturn ccPackageMetadata, nil, errors.Errorf(\"did not find any package metadata (missing %s)\", MetadataFile)\n\t}\n\n\tif err := ValidateLabel(ccPackageMetadata.Label); err != nil {","sourceCodeStart":298,"sourceCodeEnd":334,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/chaincode/persistence/chaincode_package.go#L298-L334","documentation":"When the tar entry named 'metadata.json' is found, ParseChaincodePackage json.Unmarshals its bytes into ChaincodePackageMetadata; failure returns this wrapped error naming MetadataFile. The package structure is valid, but metadata.json content is not the expected JSON shape (type, label fields).","triggerScenarios":"Calling Parse or PackageID on a package whose metadata.json is empty, contains a JSON array/string instead of an object, has wrong field types (e.g. numeric Type), or is invalid JSON (trailing commas, comments, HTML error pages).","commonSituations":"Hand-written metadata.json with syntax mistakes, metadata generated with wrong field types, or a placeholder/error page saved as metadata.json.","solutions":["Validate metadata.json with 'jq . metadata.json' or json.Unmarshal in a test; fix syntax errors.","Ensure it is a JSON object with string fields Type and Label, e.g. {\"Type\":\"cc\",\"Label\":\"mycc-v1\"}.","Recreate metadata via 'peer lifecycle chaincode package' to get canonical content.","Repackage and reinstall the chaincode with corrected metadata."],"exampleFix":"// before: metadata.json\n{\"type\": \"golang\", \"label\": 123}\n// after\n{\"Type\": \"golang\", \"Label\": \"mycc-v1.0\"}","handlingStrategy":"validation","validationCode":"var md struct {\n\tType  string `json:\"Type\"`\n\tLabel string `json:\"Label\"`\n}\nif err := json.Unmarshal(metadataBytes, &md); err != nil {\n\treturn fmt.Errorf(\"metadata.json must be a JSON object with string Type and Label: %w\", err)\n}\nif md.Type == \"\" || md.Label == \"\" {\n\treturn fmt.Errorf(\"metadata.json Type and Label must be non-empty\")\n}","typeGuard":null,"tryCatchPattern":"if _, _, err := persistence.ParseChaincodePackage(source); err != nil {\n\tvar pe *json.UnmarshalTypeError\n\tif errors.As(err, &pe) || strings.Contains(err.Error(), \"could not unmarshal\") {\n\t\treturn fmt.Errorf(\"fix metadata.json content (object with Type/Label strings): %w\", err)\n\t}\n\treturn err\n}","preventionTips":["Lint metadata.json with 'jq empty' before packaging.","Use string fields Type and Label, capitalized as the struct expects.","Generate metadata via 'peer lifecycle chaincode package', not by hand.","Ensure no error pages/placeholders get saved as metadata.json."],"tags":["json","chaincode-package","unmarshal"],"backgroundTag":"json-unmarshal-failed","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}