{"record":{"id":"03ab6d3e9fc9e610","repo":"json-path/JsonPath","slug":"can-not-map-a-src-getclass-to-double","errorCode":null,"errorMessage":"can not map a \" + src.getClass() + \" to \" + Double.class.getName()","messagePattern":"can not map a \" \\+ src\\.getClass\\(\\) \\+ \" to \" \\+ Double\\.class\\.getName\\(\\)","errorType":"exception","errorClass":"MappingException","httpStatus":null,"severity":"error","filePath":"json-path/src/main/java/com/jayway/jsonpath/spi/mapper/JsonSmartMappingProvider.java","lineNumber":178,"sourceCode":"        }\n        public Double convert(Object src) {\n            if(src == null){\n                return null;\n            }\n            if(Double.class.isAssignableFrom(src.getClass())){\n                return (Double) src;\n            } else if (Integer.class.isAssignableFrom(src.getClass())) {\n                return ((Integer) src).doubleValue();\n            } else if (Long.class.isAssignableFrom(src.getClass())) {\n                return ((Long) src).doubleValue();\n            } else if (BigDecimal.class.isAssignableFrom(src.getClass())) {\n                return ((BigDecimal) src).doubleValue();\n            } else if (Float.class.isAssignableFrom(src.getClass())) {\n                return ((Float) src).doubleValue();\n            } else if (String.class.isAssignableFrom(src.getClass())) {\n                return Double.valueOf(src.toString());\n            }\n            throw new MappingException(\"can not map a \" + src.getClass() + \" to \" + Double.class.getName());\n        }\n    }\n    private static class FloatReader extends JsonReaderI<Float> {\n        public FloatReader() {\n            super(null);\n        }\n        public Float convert(Object src) {\n            if(src == null){\n                return null;\n            }\n            if(Float.class.isAssignableFrom(src.getClass())){\n                return (Float) src;\n            } else if (Integer.class.isAssignableFrom(src.getClass())) {\n                return ((Integer) src).floatValue();\n            } else if (Long.class.isAssignableFrom(src.getClass())) {\n                return ((Long) src).floatValue();\n            } else if (BigDecimal.class.isAssignableFrom(src.getClass())) {\n                return ((BigDecimal) src).floatValue();","sourceCodeStart":160,"sourceCodeEnd":196,"githubUrl":"https://github.com/json-path/JsonPath/blob/62a4c9f0f65ba3f625aa0867d64c528ba72d09ec/json-path/src/main/java/com/jayway/jsonpath/spi/mapper/JsonSmartMappingProvider.java#L160-L196","documentation":"JsonSmartMappingProvider's DoubleReader.convert() cannot convert the source object to a java.lang.Double. It handles Double, Float, Integer, Long, Short, Byte, BigDecimal and String sources; any other runtime type reaches the final throw. Containers like JSONObject/JSONArray are never coerced to a primitive wrapper.","triggerScenarios":"map(obj, Double.class, configuration) with JsonSmartMappingProvider where obj is e.g. a JSONObject, JSONArray, Boolean, Date or custom object instead of a number or numeric String.","commonSituations":"Pointing a path at an object/array instead of a numeric leaf; mapping boolean flags to 0.0/1.0 expectations from another library; swapping mapping providers between environments (JsonSmart in prod, Jackson in tests) so one side throws.","solutions":["Verify the resolved value is numeric or a parseable numeric String before mapping to Double.class.","Fix the JsonPath expression to select the scalar numeric field.","Convert manually after reading as Object (instanceof Number -> doubleValue, else Double.parseDouble).","Switch to JacksonMappingProvider/GsonMappingProvider for broader coercion.","Provide a custom MappingProvider for exotic source types."],"exampleFix":"// before\nDouble d = cfg.mappingProvider().map(jsonArray, Double.class, cfg); // throws\n// after\nObject v = JsonPath.read(json, \"$.price\");\nDouble d = Double.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 Double\");","typeGuard":"static Double toDouble(Object v) {\n    if (v instanceof Number) return ((Number) v).doubleValue();\n    if (v instanceof String) return Double.valueOf((String) v);\n    return null;\n}","tryCatchPattern":"try {\n    Double d = cfg.mappingProvider().map(value, Double.class, cfg);\n} catch (MappingException e) {\n    Double d = toDouble(value);\n    if (d == null) throw new IllegalArgumentException(\"Non-numeric value\", e);\n}","preventionTips":["Point JsonPath expressions at numeric leaf fields only.","Validate the payload shape (scalar vs object/array) before mapping.","Use the same MappingProvider in tests and production to catch coercion gaps early.","Prefer Jackson/Gson providers for lenient numeric coercion."],"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"}