{"record":{"id":"f45e5f41ee2d5c06","repo":"json-path/JsonPath","slug":"can-not-map-a-src-getclass-to-intege","errorCode":null,"errorMessage":"can not map a \" + src.getClass() + \" to \" + Integer.class.getName()","messagePattern":"can not map a \" \\+ src\\.getClass\\(\\) \\+ \" to \" \\+ Integer\\.class\\.getName\\(\\)","errorType":"exception","errorClass":"MappingException","httpStatus":null,"severity":"error","filePath":"json-path/src/main/java/com/jayway/jsonpath/spi/mapper/JsonSmartMappingProvider.java","lineNumber":129,"sourceCode":"        }\n        public Integer convert(Object src) {\n            if(src == null){\n                return null;\n            }\n            if(Integer.class.isAssignableFrom(src.getClass())){\n               return (Integer) src;\n            } else if (Long.class.isAssignableFrom(src.getClass())) {\n                return ((Long) src).intValue();\n            } else if (Double.class.isAssignableFrom(src.getClass())) {\n                return ((Double) src).intValue();\n            } else if (BigDecimal.class.isAssignableFrom(src.getClass())) {\n                return ((BigDecimal) src).intValue();\n            } else if (Float.class.isAssignableFrom(src.getClass())) {\n                return ((Float) src).intValue();\n            } else if (String.class.isAssignableFrom(src.getClass())) {\n                return Integer.valueOf(src.toString());\n            }\n            throw new MappingException(\"can not map a \" + src.getClass() + \" to \" + Integer.class.getName());\n        }\n    }\n    private static class LongReader extends JsonReaderI<Long> {\n        public LongReader() {\n            super(null);\n        }\n        public Long convert(Object src) {\n            if(src == null){\n                return null;\n            }\n            if(Long.class.isAssignableFrom(src.getClass())){\n                return (Long) src;\n            } else if (Integer.class.isAssignableFrom(src.getClass())) {\n                return ((Integer) src).longValue();\n            } else if (Double.class.isAssignableFrom(src.getClass())) {\n                return ((Double) src).longValue();\n            } else if (BigDecimal.class.isAssignableFrom(src.getClass())) {\n                return ((BigDecimal) src).longValue();","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/json-path/JsonPath/blob/62a4c9f0f65ba3f625aa0867d64c528ba72d09ec/json-path/src/main/java/com/jayway/jsonpath/spi/mapper/JsonSmartMappingProvider.java#L111-L147","documentation":"JsonSmartMappingProvider's IntegerReader.convert() cannot convert the source object to a java.lang.Integer. It only handles Integer, Long, Double, BigDecimal, Float and String sources (plus null); any other runtime type reaches the final throw. This is a hard failure by design: the json-smart based mapping provider refuses unmappable types instead of guessing.","triggerScenarios":"Calling Configuration.mappingProvider(new JsonSmartMappingProvider()).map(obj, Integer.class, ...) (or reading a path with .map(Integer.class)) where obj is a runtime type outside {Integer, Long, Double, BigDecimal, Float, String} — e.g. a JSONObject, JSONArray, Boolean, Date or null-wrapped custom bean.","commonSituations":"Using JsonSmartMappingProvider (the default for JsonSmartProvider) but attempting to map a whole JSONObject/JSONArray node to Integer instead of a scalar; switching from Jackson/Gson provider where different intermediate types appear; passing parsed values wrapped in container types.","solutions":["Ensure the value being mapped is a scalar number or numeric String before calling map(..., Integer.class, ...).","Check the path: use $.scalarField (an array index or object value), not a $.node that resolves to a JSONObject/JSONArray.","Extract the value as Object first, verify with instanceof, and convert manually (e.g. ((Number)v).intValue()).","Switch to a different MappingProvider (JacksonMappingProvider, GsonMappingProvider) that maps containers to POJOs.","Implement and register a custom MappingProvider covering your source types."],"exampleFix":"// before\nInteger n = configuration.mappingProvider().map(jsonObject, Integer.class, configuration); // MappingException\n// after\nObject v = JsonPath.read(json, \"$.count\");\nInteger n = (v instanceof Number) ? ((Number) v).intValue() : Integer.valueOf(v.toString());","handlingStrategy":"type-guard","validationCode":"Object v = JsonPath.read(json, \"$.field\");\nif (!(v instanceof Number || v instanceof String))\n    throw new IllegalArgumentException(\"Cannot map \" + (v == null ? \"null\" : v.getClass()) + \" to Integer\");","typeGuard":"static Integer toInt(Object v) {\n    if (v instanceof Number) return ((Number) v).intValue();\n    if (v instanceof String) return Integer.valueOf((String) v);\n    return null;\n}","tryCatchPattern":"try {\n    Integer n = cfg.mappingProvider().map(value, Integer.class, cfg);\n} catch (MappingException e) {\n    Integer n = toInt(value); // fallback manual conversion\n    if (n == null) throw new IllegalArgumentException(\"Non-numeric value\", e);\n}","preventionTips":["Always read scalar leaf paths, never whole JSONObject/JSONArray nodes, when mapping to wrapper types.","Read as Object and instanceof-check before mapping to a specific class.","Keep the mapping provider consistent between test and production environments.","Prefer Jackson/Gson mapping providers if you rely on coercion of many types."],"tags":["json-path","mapping","type-conversion","json-smart"],"backgroundTag":"incompatible-source-type","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"}