読者です 読者をやめる 読者になる 読者になる

その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

JSONObject のput メソッドを使うとWarning がもりもり出るので僕、不満足!!

java

json-simple のJSONObject でサポートされているput() メソッドを使うと、
Warning がもりもり出て、画面が黄色くなってしまうので大変アレです。

↓こんな感じで書くと、obj.putが警告を出してくるので精神が不安定になります。

import org.json.simple.JSONObject;

public class JSONObjectSample {
    public final void jsonSample() { 
        JSONObject obj = new JSONObject();
        obj.put("first_name", "James");
        obj.put("second_name", "Brown");
    }
} 

警告メッセージ *1 を読むとわかるように、 「型安全が守られてないから何とかしろ」ってことですね。
警告では、JSONObject ではなく型を指定出来るHashMap を使うように薦めてきますが、
男にはJSONObject を使わねばならぬ時があるので *2、なんとかしたいです。

手っ取り早い方法

手っ取り早く警告を消すには、@SuppressWarnings("unchecked") と書いてやれば良いです。

↓こんな感じ
import org.json.simple.JSONObject;

@SuppressWarnings("unchecked")
public class JSONObjectSample {
    public final void jsonSample() { 
        JSONObject obj = new JSONObject();
        obj.put("first_name", "James");
        obj.put("second_name", "Brown");
    }
} 

いやいや、それってどうなのよ

警告は抑制されますが、本質的な問題、つまり「型安全ではない」という問題は解決されていません。
ので、ちょっと考えて以下のように書き換えてみました。

import java.util.HashMap;

import org.json.simple.JSONObject;

HashMap<String, String> hash = new HashMap<String, String>();
hash.put("first_name", "James");
hash.put("second_name", "Brown");

JSONObject obj = new JSONObject();
for (String key : hash.keySet()) {
    obj.put(key, hash.get(key));
} 

こうすると、HashMap の構造をそのままJSONObject に移植しているので型安全であると言えるのでは無いでしょうか。
ただ、この方法でもobj.pu() の部分で警告が出るので@SuppressWarnings("unchecked")等で対応する必要があるので、
「本当に解決してんのか?」と訊かれるとちょっとあやしい感じです。

(追記)
あと、もちろんパフォーマンスが悪くなるのでこれもどうかと思う所です。
(追記ここまで)

結論

@SuppressWarnings("unchecked") からは逃げられない。

というか、JSONObject は型とかそういうのを関係なく、ガンガンものを突っ込めるのが利点だと思うんですが、
そこら辺はどうなんでしょうね。確かに、put 時の型のvalidation は必要 (な場合がある) かも知れませんが。

タイトルの参考映像

*1:Type safety: The method put(Object, Object) belongs to the raw type HashMap.

*2:本当に?