{"record":{"id":"6f5ff5677369f374","repo":"apple/pkl","slug":"values-of-type-datasize-cannot-be-rendered-as-js","errorCode":null,"errorMessage":"Values of type `DataSize` cannot be rendered as JSON. Value: %s","messagePattern":"Values of type `DataSize` cannot be rendered as JSON\\. Value: (.+?)","errorType":"exception","errorClass":"RendererException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/JsonRenderer.java","lineNumber":101,"sourceCode":"\n    @Override\n    public void visitBoolean(Boolean value) {\n      try {\n        writer.value(value);\n      } catch (IOException e) {\n        throw new UncheckedIOException(e);\n      }\n    }\n\n    @Override\n    public void visitDuration(Duration value) {\n      throw new RendererException(\n          String.format(\"Values of type `Duration` cannot be rendered as JSON. Value: %s\", value));\n    }\n\n    @Override\n    public void visitDataSize(DataSize value) {\n      throw new RendererException(\n          String.format(\"Values of type `DataSize` cannot be rendered as JSON. Value: %s\", value));\n    }\n\n    @Override\n    public void visitBytes(byte[] value) {\n      throw new RendererException(\n          String.format(\n              \"Values of type `Bytes` cannot be rendered as JSON. Value: %s\", (Object) value));\n    }\n\n    // Pair coming from the runtime can never admit null (in-language null is represented as PNull)\n    @SuppressWarnings(\"DataFlowIssue\")\n    @Override\n    public void visitPair(Pair<?, ?> value) {\n      try {\n        writer.beginArray();\n        visit(value.getFirst());\n        visit(value.getSecond());","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/JsonRenderer.java#L83-L119","documentation":"JsonRenderer throws this RendererException when rendering a Pkl DataSize value as JSON, since JSON has no native datasize representation. Like the Duration case, it refuses instead of guessing an encoding.","triggerScenarios":"Rendering to JSON a module or property containing a DataSize value (e.g. `size = 5.mb`) via visitDataSize.","commonSituations":"Config modules declaring memory/disk/bandwidth limits rendered to JSON for APIs or tooling.","solutions":["Convert the DataSize to a scalar first (e.g. value.value in bytes) or expose a String/Number property instead","Exclude datasize fields from the JSON output","Pick an output format that supports sizes, or a custom renderer"],"exampleFix":"// before\nprop maxMem: DataSize = 2.gb\n// after\nprop maxMemBytes: Number = 2.gb.value // 2000000000","handlingStrategy":"type-guard","validationCode":"if (value instanceof DataSize) {\n  throw new IllegalArgumentException(\"convert DataSize to Number before JSON rendering\");\n}","typeGuard":"boolean isJsonRenderable(Object v) {\n  return !(v instanceof Duration || v instanceof DataSize || v instanceof byte[]);\n}","tryCatchPattern":"try {\n  renderer.render(value);\n} catch (RendererException e) {\n  LOG.error(\"JSON rendering unsupported: {}\", e.getMessage());\n}","preventionTips":["Prefer Number-typed fields (in bytes) when the module is meant for JSON output","Run a pre-render type check over the property tree","Document that DataSize fields need explicit conversion for JSON consumers"],"tags":["java","pkl","json","renderer"],"backgroundTag":"json-serialization-failed","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}