{"record":{"id":"b517124cc1151871","repo":"Hmbown/CodeWhale","slug":"cargo-metadata-is-not-valid-json-error","errorCode":null,"errorMessage":"Cargo metadata is not valid JSON: {error}","messagePattern":"Cargo metadata is not valid JSON: (.+?)","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"scripts/release/validate-crate-publish-order.py","lineNumber":56,"sourceCode":"    else:\n        process = subprocess.run(\n            [\"cargo\", \"metadata\", \"--locked\", \"--format-version\", \"1\", \"--no-deps\"],\n            check=False,\n            capture_output=True,\n            text=True,\n        )\n        if process.returncode != 0:\n            detail = process.stderr.strip()\n            suffix = f\": {detail}\" if detail else \"\"\n            raise ValidationError(\n                f\"cargo metadata failed with exit code {process.returncode}{suffix}\"\n            )\n        raw = process.stdout\n\n    try:\n        metadata = json.loads(raw)\n    except json.JSONDecodeError as error:\n        raise ValidationError(f\"Cargo metadata is not valid JSON: {error}\") from error\n    if not isinstance(metadata, dict):\n        raise ValidationError(\"Cargo metadata root must be an object\")\n    return metadata\n\n\ndef workspace_packages(metadata: dict[str, Any]) -> list[dict[str, Any]]:\n    members = metadata.get(\"workspace_members\")\n    packages = metadata.get(\"packages\")\n    if not isinstance(members, list) or not isinstance(packages, list):\n        raise ValidationError(\"Cargo metadata must contain workspace_members and packages lists\")\n\n    packages_by_id = {\n        package.get(\"id\"): package\n        for package in packages\n        if isinstance(package, dict) and isinstance(package.get(\"id\"), str)\n    }\n    missing_ids = [member for member in members if member not in packages_by_id]\n    if missing_ids:","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/433685b2024e7bc4c99e1e2e326bcad39b4d9d65/scripts/release/validate-crate-publish-order.py#L38-L74","documentation":"validate-crate-publish-order.py parses the raw cargo metadata output as JSON and raises this ValidationError if json.loads fails, wrapping the JSONDecodeError detail. The metadata source (file or cargo stdout) did not contain valid JSON.","triggerScenarios":"A hand-edited or truncated metadata file is passed via metadata_file; the file contains TOML or human-readable text instead of JSON; a wrapper script captured cargo's progress/log output mixed into stdout.","commonSituations":"Saving `cargo metadata` output without --format-version 1 or accidentally redirecting warnings into the file; an old metadata artifact from a different tool version; partial file writes from a failed CI artifact upload.","solutions":["Regenerate the metadata file with cargo metadata --locked --format-version 1 --no-deps > metadata.json","Validate the file with `python -m json.tool metadata.json` to locate the syntax problem","Omit the file argument so the script fetches fresh metadata from cargo directly","Check the file is not truncated (compare size / tail of file)"],"exampleFix":"# before (bad artifact)\npython validate-crate-publish-order.py stale.txt\n# after\ncargo metadata --locked --format-version 1 --no-deps > cargo-metadata.json\npython validate-crate-publish-order.py cargo-metadata.json","handlingStrategy":"validation","validationCode":"import json\nraw = open(\"cargo-metadata.json\", encoding=\"utf-8\").read()\ntry:\n    json.loads(raw)\nexcept json.JSONDecodeError as e:\n    raise SystemExit(f\"metadata file is not valid JSON (line {e.lineno}): regenerate with cargo metadata\")","typeGuard":null,"tryCatchPattern":"try:\n    validate_publish_order(metadata_file)\nexcept ValidationError as e:\n    if \"not valid JSON\" in str(e):\n        print(\"regenerate: cargo metadata --locked --format-version 1 --no-deps > cargo-metadata.json\")","preventionTips":["Only feed the validator files produced by cargo metadata --format-version 1","Run python -m json.tool on the artifact before validation in CI","Avoid hand-editing metadata JSON; regenerate instead"],"tags":["python","json","cargo","parsing"],"backgroundTag":"json-parse-error","analyzedSha":"433685b2024e7bc4c99e1e2e326bcad39b4d9d65","analyzedAt":"2026-09-15T12:24:24.634Z","contentChangedAt":"2026-09-15T12:24:24.634Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}