{"record":{"id":"a836b5d9dca93786","repo":"flowable/flowable-engine","slug":"invalid-json-expression-to-parse","errorCode":null,"errorMessage":"Invalid JSON expression to parse","messagePattern":"Invalid JSON expression to parse","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-bpmn-model/src/main/java/org/flowable/bpmn/model/JsonDataObject.java","lineNumber":34,"sourceCode":"\nimport com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;\n\nimport tools.jackson.core.JacksonException;\nimport tools.jackson.databind.JsonNode;\nimport tools.jackson.databind.json.JsonMapper;\n\n/**\n * @author Christophe DENEUX\n */\npublic class JsonDataObject extends ValuedDataObject {\n\n    @Override\n    public void setValue(Object value) {\n    \tif (value instanceof String && !StringUtils.isEmpty(((String) value).trim())) {\n            try {\n                this.value = JsonMapper.shared().readTree((String) value);\n            } catch (JacksonException e) {\n                throw new IllegalArgumentException(\"Invalid JSON expression to parse\", e);\n            }\n        } else if (value instanceof JsonNode) {\n    \t\tthis.value = value;\n        } else {\n            JsonMapper mapper = JsonMapper.builder()\n                    // By default, Jackson serializes only public fields, we force to use all fields of the Java Bean\n                    .changeDefaultVisibility(visibilityChecker -> visibilityChecker.withFieldVisibility(Visibility.ANY))\n                    .build();\n\n            this.value = mapper.convertValue(value, JsonNode.class);\n    \t}\n    }\n\n    @Override\n    public JsonDataObject clone() {\n        JsonDataObject clone = new JsonDataObject();\n        clone.setValues(this);\n        return clone;","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-bpmn-model/src/main/java/org/flowable/bpmn/model/JsonDataObject.java#L16-L52","documentation":"JsonDataObject.setValue accepts either a JSON-formatted String, a Jackson JsonNode, or an arbitrary bean (serialized via Jackson). If a String is provided and Jackson cannot parse it as JSON, the method wraps the JacksonException in IllegalArgumentException with this message.","triggerScenarios":"Calling jsonDataObject.setValue(someString) where someString is not valid JSON (e.g. plain text, malformed JSON like \"{a:1}\" with unquoted keys).","commonSituations":"Passing user input or configuration strings directly as JSON data object values; missing quotes/brackets; JSON5 or trailing commas not supported by Jackson.","solutions":["Ensure the string is valid JSON before calling setValue (e.g. validate with JsonMapper.readTree in a try/catch)","Pass a JsonNode instead of a raw String","Pass a Java bean and let Flowable serialize it, instead of a pre-formatted string"],"exampleFix":"// before\ndataObject.setValue(\"{name: 'x'}\"); // invalid JSON\n// after\ndataObject.setValue(\"{\\\"name\\\":\\\"x\\\"}\");","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { dataObject.setValue(v); } catch (IllegalArgumentException e) { /* v was not valid JSON */ }","preventionTips":["Validate JSON before calling setValue; prefer JsonNode inputs"],"tags":["json","validation","argument"],"backgroundTag":"json-parse-error","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}