{"record":{"id":"6861f6a3e9b2918f","repo":"apple/pkl","slug":"cannotrendernonstringmap","errorCode":"cannotRenderNonStringMap","errorMessage":"cannotRenderNonStringMap","messagePattern":"cannotRenderNonStringMap","errorType":"error_code","errorClass":"VmException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/stdlib/AbstractRenderer.java","lineNumber":435,"sourceCode":"  @Override\n  public void visitTypeAlias(VmTypeAlias value) {\n    cannotRenderTypeAddConverter(value);\n  }\n\n  @Override\n  public void visitClass(VmClass value) {\n    cannotRenderTypeAddConverter(value);\n  }\n\n  @Override\n  public void visitFunction(VmFunction value) {\n    cannotRenderTypeAddConverter(value);\n  }\n\n  protected void cannotRenderNonStringKey(Object key) {\n    assert enclosingValue != null;\n    var isMap = enclosingValue instanceof VmMap;\n    throw new VmExceptionBuilder()\n        .evalError(isMap ? \"cannotRenderNonStringMap\" : \"cannotRenderObjectWithNonStringKey\", name)\n        .withProgramValue(isMap ? \"Map\" : \"Object\", enclosingValue)\n        .withProgramValue(\"Key\", key)\n        .build();\n  }\n\n  protected void cannotRenderNonScalarKey(Object key) {\n    assert enclosingValue != null;\n    var isMap = enclosingValue instanceof VmMap;\n    throw new VmExceptionBuilder()\n        .evalError(isMap ? \"cannotRenderNonScalarMap\" : \"cannotRenderObjectWithNonScalarKey\", name)\n        .withProgramValue(isMap ? \"Map\" : \"Object\", enclosingValue)\n        .withProgramValue(\"Key\", key)\n        .build();\n  }\n}\n","sourceCodeStart":417,"sourceCodeEnd":452,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/stdlib/AbstractRenderer.java#L417-L452","documentation":"When rendering a Map, all keys must be strings (or, for objects, valid member names). cannotRenderNonStringKey detects a non-String key while the enclosing value is a VmMap and throws cannotRenderNonStringMap, because target formats like YAML/JSON/PList map keys must be strings. The offending key is attached to the error as program value `Key`.","triggerScenarios":"Rendering a Map whose keys are non-String values (Int, Duration, Regex, etc.) via a renderer such as YamlRenderer, JsonRenderer, or PList renderer.","commonSituations":"Building a Map with integer keys (e.g. ports or indexes) and rendering it as JSON/YAML output; using durations or numbers as keys after a refactor; converting dynamic data that used numeric keys.","solutions":["Convert non-string keys to strings before rendering: `[key.toString()] = value`.","Zero-pad or format integer keys deliberately (e.g. `\"\\(key)\"`) so output is stable.","Use a Listing of pairs/objects instead of a Map if keys are inherently non-string.","Check upstream data (parsed files, computed maps) for non-string keys."],"exampleFix":"// before\noutput.value = Map(8080, \"http\") // Int key rendered as JSON\n\n// after\noutput.value = Map(\"8080\", \"http\")","handlingStrategy":"validation","validationCode":"// assert all keys are strings before rendering\nfunction hasStringKeys(m: Map) = m.keys.every((k) -> k is String)","typeGuard":null,"tryCatchPattern":"try { render(mapValue) } catch (e) { if (e.message.contains('cannotRenderNonStringMap')) render(stringifyKeys(mapValue)) else throw e }","preventionTips":["Always build rendered maps with string keys","Stringify numeric keys deliberately (with zero-padding if order matters)","Audit maps built from parsed external data for key types"],"tags":["pkl","renderer","serialization","map-keys"],"backgroundTag":"invalid-argument-value","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}