Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【Java】JacksonでのInfinityの扱いについて

自分の備忘録がてら。

前回、JavaScriptのInfinityのJSONでの扱いについて書いた。

plugout.hateblo.jp

 

今回はJavaのJackson(com.fasterxml.jackson)だとどうなるのかなと思って試したのを残しておく。

github.com

 

ちなみにInfinityはdoubleやfloatで0除算を行った場合に、その結果として取得される。

よく勘違いされるがJavaで0除算を行うと[java.lang.ArithmeticException]が発生されるというのは正確ではなく、intやlong等では発生するがdoubleやfloatでは発生しない

 

結果としてはJacksonの[new ObjectMapper().writer().writeValueAsString()]を利用した場合、InfinityはInfinityという文字列として出力される。

つまりJavaScriptJSON.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除算は避けた方が良いのだが、抜けてしまった場合のデバッグではしっかり挙動を把握しておくとスムーズかもしれない。

 

【JavaScript】[JSON.stringify()]にInfinityを与えるとnullになる

自分の備忘録がてら。

 

[JSON.stringify()]はObjectからJSON文字列を生成する関数だが、結果で一部正確に反映されないものが存在する。

そのうちの一つがInfinity∞(無限)という意味だ。

JSON文字列上、∞は表現できないためにnullになってしまう。

(尚、InfinityにはNumber.POSITIVE_INFINITYとNumber.NEGATIVE_INFINITYが存在し、単にInfinityとした場合はNumber.POSITIVE_INFINITYと同義になる)

plugout.hateblo.jp

 

例: コンソールで実行1

> JSON.stringify(Infinity);
"null"
> JSON.stringify(Number.POSITIVE_INFINITY);
"null"
> JSON.stringify(Number.NEGATIVE_INFINITY);
"null"

通常Infinityをそのまま使用する様なプログラムを組むことはないだろうが、JavaScriptで0除算を行った場合に結果として入ってくるので注意が必要。

 

例: コンソールで実行2

> 128 / 0;
Infinity

つまり何らかの計算結果をオブジェクトの変数へ登録する際にInfinityを考慮せず、そのままJSON文字列化した場合にはnullとして出力されてしまう。

 

例: コンソールで実行3

JSON.stringify({"hoge": 128 / 0});
> "{"hoge":null}"

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)