90995


以下のようなテストコードをかいて

[code]

    import java.io.*;
    import org.json.simple.JSONArray;
    import org.json.simple.JSONObject;
    import org.json.simple.parser.JSONParser;
    import org.json.simple.parser.ParseException;
    
    public class JsonTest {
        public static void main(String[] args) throws Exception {
            File file = new File("test.json");
            JSONParser parser = new JSONParser();
            JSONObject json = (JSONObject)parser.parse(new FileReader(file));
            JSONArray data1 = (JSONArray)json.get("data1");
            System.out.println(sum(data1));
            JSONArray data2 = (JSONArray)json.get("data2");
            System.out.println(sum(data2));
        }
    
        private static int sum(JSONArray ja) {
            int sum = 0;
            for(int i = 0; i < ja.size(); i++)
                sum += ((Integer)ja.get(i)).intValue();
            return sum;
        }
    }
    
[/code]

このようなJSONを読み込ませてみたところ

[code]

    {
        "data1": [1,2,3,4],
        "data2": [11,12,13,14]
    }
    
[/code]

以下のキャストエラーが出ます  
`Exception in thread "main" java.lang.ClassCastException: class java.lang.Long
cannot be cast to class java.lang.Integer (java.lang.Long and
java.lang.Integer are in module java.base of loader 'bootstrap')`

<https://code.google.com/archive/p/json-simple/wikis/DecodingExamples.wiki>  
こちら公式ページにデコードサンプルが載ってるんですが  
全部 System.out.print してしまっているので  
JsonArray#get した型を何にキャストすれば int になるのかよくわかりません

java で JSON を扱うのに同じ名前の JsonArray ってのがあるみたいなんですが  
たまたま最初にみたのが simple だったのでこっち使ってしまいましたが  
もう１つの JsonArray の方が使いやすいんでしょうか…


CC BY-SA 4.0
2022-09-08T04:46:24.980
90993
2022-09-08T09:19:10.230
question
java
json の int 配列の中身を java 言語上の int 型で取得したい


`Long`は`Integer`にキャスト不能ですので、

[code]

    sum += ((Long)ja.get(i)).intValue();
    
[/code]


CC BY-SA 4.0
2022-09-08T05:05:57.087
90994
2022-09-08T05:29:02.993
2022-09-08T05:29:02.993
13127
13127
90993
answer


`sum +=
((Integer)ja.get(i)).intValue();`を`System.out.println(ja.get(i).getClass().getName());`に書き換えると、`java.lang.Long`が返ることが分かります。  
`ja.get(i)`からは表面上Object型が返ってきますが、中身はLong型ですので、下記の記述でキャストすれば正常に動きます。

[code]

    sum += ((Long)ja.get(i)).intValue();
    
[/code]

なお、類似質問は本家SOにもありますが、Integer型ではなくLong型が返ってくる理由は見当たりませんでした。

[JSON - simple get an Integer instead of
Long](https://stackoverflow.com/q/20869138)  
[JSON Simple: integer parsing](https://stackoverflow.com/q/29770329)


CC BY-SA 4.0
2022-09-08T05:27:17.727
90995
2022-09-08T08:47:26.867
2022-09-08T08:47:26.867
9820
9820
90993
answer


[こちらの回答](https://ja.stackoverflow.com/a/90998/2808)に記載したとおり、現在の実装上、整数値は`Long`型で解決されますが、このあたり([1](https://github.com/fangyidong/json-
simple/blob/master/src/test/java/org/json/simple/Test.java#L285),
[2](https://github.com/fangyidong/json-
simple/blob/master/src/main/java/org/json/simple/parser/Yytoken.java#L11))を見ると、数値は(整数か小数かによらず)数値型として扱って欲しそう見えるので、
`Number` で扱うのがライブラリ作成者の意図に沿っているかもしれません。

[code]

        private static int sum(JSONArray ja) {
            int sum = 0;
            for(int i = 0; i < ja.size(); i++)
                sum += ((Number)ja.get(i)).intValue();
            return sum;
        }
    
[/code]

(とはいえ、もはやこのライブラリが更新されることはないと思うので、今の実装に合わせてしまっても(つまり、整数が入力されることがわかっているのであれば`Long`にキャストしても)支障は無いと思いますが)


CC BY-SA 4.0
2022-09-08T09:19:10.230
90999
2022-09-08T09:19:10.230
2808
90993
answer