В чем разница между asDouble () и doubleValue () в API Джексона? - PullRequest
1 голос
/ 16 февраля 2020

Я немного запутался при использовании этих методов. Если оба метода возвращают одно и то же значение, то почему API Джексона предоставил два разных метода?

1 Ответ

4 голосов
/ 16 февраля 2020

В соответствии с API-интерфейсом jackson-databind 2.2.0

publi c double asDouble ()

Метод, который попытается преобразовать значение этого узла в Java double. Числа приводятся с использованием правил по умолчанию Java; логические значения преобразуются в 0.0 (false) и 1.0 (true), а строки анализируются с использованием стандартных правил синтаксического анализа Java языка. Если представление не может быть преобразовано в int (включая структурированные типы, такие как Objects и Arrays), будет возвращено значение по умолчанию 0.0; без исключений.

publi c double doubleValue ()

Возвращает 64-битную плавающую точку ( double) значение для этого узла, если и только если этот узел имеет цифру c (isNumber () возвращает true). Для других типов возвращает 0.0. Для целочисленных значений преобразование выполняется с использованием принуждения; это может привести к переполнению со значениями BigInteger.

Пример:

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());
}

Выход:

{"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

Как вы можете видеть здесь, salaryNode значение типа String. Значит это не номер. Следовательно, метод doubleValue() возвращает значение по умолчанию 0.0, но значение amountNode равно Number. Следовательно, doubleValue() метод возвращает свое первоначальное значение 98765.43

...