{"record":{"id":"b0a05b0654e16102","repo":"json-path/JsonPath","slug":"cannot-create-json-element-from-null","errorCode":null,"errorMessage":"Cannot create JSON element from null","messagePattern":"Cannot create JSON element from null","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"json-path/src/main/java/com/jayway/jsonpath/spi/json/JakartaJsonProvider.java","lineNumber":424,"sourceCode":"                return defaultJsonProvider.createValue(v);\r\n            }\r\n        } else if (obj instanceof Collection) {\r\n    \t\tJsonArray result = jsonBuilderFactory.createArrayBuilder((Collection<?>) obj).build();\r\n    \t\treturn mutableJson ? proxyAll(result) : result;\r\n        } else if (obj instanceof Map) {\r\n    \t\t@SuppressWarnings(\"unchecked\")\r\n    \t\tMap<String, Object> map = (Map<String, Object>) obj;\r\n    \t\tJsonObject result = jsonBuilderFactory.createObjectBuilder(map).build();\r\n    \t\treturn mutableJson ? proxyAll(result) : result;\r\n        } else if (obj instanceof JsonArrayBuilder) {\r\n        \tJsonArray result = ((JsonArrayBuilder) obj).build();\r\n    \t\treturn mutableJson ? proxyAll(result) : result;\r\n        } else if (obj instanceof JsonObjectBuilder) {\r\n        \tJsonObject result = ((JsonObjectBuilder) obj).build();\r\n    \t\treturn mutableJson ? proxyAll(result) : result;\r\n        } else {\r\n            String className = obj.getClass().getSimpleName();\r\n            throw new UnsupportedOperationException(\"Cannot create JSON element from \" + className);\r\n        }\r\n    }\r\n\r\n    private JsonStructure proxyAll(JsonStructure jsonStruct) {\r\n    \tif (jsonStruct == null) {\r\n    \t\treturn null;\r\n    \t} else if (jsonStruct instanceof JsonArrayProxy) {\r\n    \t\treturn (JsonArray) jsonStruct;\r\n    \t} else if (jsonStruct instanceof JsonArray) {\r\n    \t\tList<Object> array = new ArrayList<>();\r\n    \t\tfor (JsonValue v : (JsonArray) jsonStruct) {\r\n    \t\t\tif (v instanceof JsonStructure) {\r\n    \t\t\t\tv = proxyAll((JsonStructure) v);\r\n    \t\t\t}\r\n    \t\t\tarray.add(v);\r\n    \t\t}\r\n    \t\treturn new JsonArrayProxy(jsonBuilderFactory.createArrayBuilder(array).build());\r\n    \t} else if (jsonStruct instanceof JsonObjectProxy) {\r","sourceCodeStart":406,"sourceCodeEnd":442,"githubUrl":"https://github.com/json-path/JsonPath/blob/62a4c9f0f65ba3f625aa0867d64c528ba72d09ec/json-path/src/main/java/com/jayway/jsonpath/spi/json/JakartaJsonProvider.java#L406-L442","documentation":"JakartaJsonProvider.wrap() converts a plain Java object into a Jakarta JSON-P JsonValue. It handles JsonValue, Boolean, CharSequence, Number, Collection, Map and the builder types; any other type (custom POJO, Date, enum, etc.) hits the final else and throws UnsupportedOperationException('Cannot create JSON element from <ClassName>'). The message names the unsupported class (note: if obj is null, a NullPointerException occurs earlier at obj.getClass(), though null normally becomes JsonValue.NULL before that branch).","triggerScenarios":"Calling setArrayIndex or setProperty (JsonPath.set/put/append APIs) with a value object the provider cannot map — e.g. a POJO, java.util.Date, Optional, or a non-supported container type; wrapping arbitrary objects into a document via mapProperty with a non-mappable payload.","commonSituations":"Migrating from Gson/Jackson-based providers where POJOs were serialized implicitly, to the Jakarta JSON-P provider which only maps basic types; passing Date or LocalDateTime values into JSON mutations; forgetting to convert domain objects to Map/Collection/JsonStructure first.","solutions":["Convert the value before passing it: use a Map/List, String, Number, Boolean, or a JsonObjectBuilder/JsonArrayBuilder","Serialize the POJO yourself (e.g. with a DTO mapper) into a Map<String,Object> and pass that to setProperty/setArrayIndex","Catch UnsupportedOperationException and fall back to a String conversion (obj.toString() or a formatter) for values like Date","Extend your wrapping layer (wrap() equivalent) to handle your domain types before delegating to the provider"],"exampleFix":"// before\nprovider.setProperty(doc, \"created\", new Date()); // UnsupportedOperationException\n// after\nprovider.setProperty(doc, \"created\", new java.text.SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ss'Z'\")\n    .format(new Date())); // String maps to JsonString","handlingStrategy":"type-guard","validationCode":"// Java\nprivate static boolean isWrappable(Object v) {\n    return v == null || v instanceof JsonValue || v instanceof Boolean || v instanceof CharSequence\n        || v instanceof Number || v instanceof Collection || v instanceof Map\n        || v instanceof JsonArrayBuilder || v instanceof JsonObjectBuilder;\n}","typeGuard":"if (!(v instanceof String || v instanceof Number || v instanceof Boolean\n      || v instanceof Map || v instanceof Collection || v instanceof JsonValue)) {\n    throw new IllegalArgumentException(\"Convert \" + v.getClass() + \" to Map/List before setting\");\n}","tryCatchPattern":"try {\n    provider.setProperty(doc, key, value);\n} catch (UnsupportedOperationException e) {\n    provider.setProperty(doc, key, String.valueOf(value)); // fallback: store as string\n}","preventionTips":["Never pass POJOs, Date, or Optional values directly to JsonPath.set/put with the Jakarta provider","Convert domain objects to Map/List DTOs before mutation","Keep a small mapping utility (Date->ISO string, enums->name()) at mutation boundaries","Document which value types your chosen JsonProvider supports"],"tags":["json","json-path","unsupported-type","json-p-provider"],"backgroundTag":"unsupported-operation","analyzedSha":"62a4c9f0f65ba3f625aa0867d64c528ba72d09ec","analyzedAt":"2026-09-11T11:36:00.448Z","contentChangedAt":"2026-09-11T11:36:00.448Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}