Search code examples
javajacksonjackson-databindjsonnode

What is the difference between asDouble() and doubleValue() in Jackson API?


I am little confused while using these methods. If both methods return same value then why Jackson API has provided two different methods?


Solution

  • According to the jackson-databind 2.2.0 API

    public double asDouble()

    Method that will try to convert value of this node to a Java double. Numbers are coerced using default Java rules; booleans convert to 0.0 (false) and 1.0 (true), and Strings are parsed using default Java language integer parsing rules. If representation can not be converted to an int (including structured types like Objects and Arrays), default value of 0.0 will be returned; no exceptions are thrown.

    public double doubleValue()

    Returns 64-bit floating point (double) value for this node, if and only if this node is numeric (isNumber() returns true). For other types returns 0.0. For integer values, conversion is done using coercion; this may result in overflows with BigInteger values.

    Example:

    public static void main(String[] args) throws IOException {
        String jsonString = "{\"name\":\"Altaf Java\",\"salary\":\"12345.67\",\"amount\":98765.43}";
        System.out.println(jsonString);
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(jsonString);
        JsonNode salaryNode = rootNode.get("salary");
        System.out.println("salaryNode.isNumber()=" + salaryNode.isNumber());
        System.out.println("salaryNode.asDouble()="+salaryNode.asDouble());
        System.out.println("salaryNode.doubleValue()="+salaryNode.doubleValue());
        JsonNode amountNode = rootNode.get("amount");
        System.out.println("amountNode.isNumber()=" + amountNode.isNumber());
        System.out.println("amountNode.asDouble()=" + amountNode.asDouble());
        System.out.println("amountNode.doubleValue()=" + amountNode.doubleValue());
    }
    

    Output:

    {"name":"Altaf Java","salary":"12345.67","amount":98765.43}
    salaryNode.isNumber()=false
    salaryNode.asDouble()=12345.67
    salaryNode.doubleValue()=0.0
    amountNode.isNumber()=true
    amountNode.asDouble()=98765.43
    amountNode.doubleValue()=98765.43
    

    As you can see here, salaryNode value is String type. Means it is not Number. Hence doubleValue() method returns default value 0.0 but amountNode value is Number. Hence doubleValue() method returns its original value 98765.43