自分の備忘録がてら。
前回、JavaScriptのInfinityのJSONでの扱いについて書いた。
今回はJavaのJackson(com.fasterxml.jackson)だとどうなるのかなと思って試したのを残しておく。
ちなみにInfinityはdoubleやfloatで0除算を行った場合に、その結果として取得される。
よく勘違いされるがJavaで0除算を行うと[java.lang.ArithmeticException]が発生されるというのは正確ではなく、intやlong等では発生するがdoubleやfloatでは発生しない。
結果としてはJacksonの[new ObjectMapper().writer().writeValueAsString()]を利用した場合、InfinityはInfinityという文字列として出力される。
つまりJavaScriptのJSON.parse()とは挙動が違った。
例: Demo1.java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Demo1 {
public static void main(String... args) throws JsonProcessingException {
double value = 128.0 / 0.0;
String json = new ObjectMapper().writer().writeValueAsString(value);
System.out.println(json);
}
}
結果: Demo1.java
"Infinity"
そして逆にJSON文字列からdoubleへ戻した場合も、正常にInfinityとして解釈された。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Demo2 {
public static void main(String... args) throws JsonProcessingException {
String json = "\"Infinity\"";
double result = new ObjectMapper().readValue(json, Double.class);
System.out.println(result);
}
}
結果: Demo2.java
Infinity
そもそも0除算は避けた方が良いのだが、抜けてしまった場合のデバッグではしっかり挙動を把握しておくとスムーズかもしれない。