hereからこの例を試していますが、このコードを使用してファイルに書き込んでいます:JavaでのJSONの読み込み:java.lang.ClassCastException:java.lang.Longをjava.lang.Integerにキャストすることはできません
public void Write() {
FileWriter file = null;
try {
JSONObject o = new JSONObject();
JSONObject obj = new JSONObject();
obj.put("name", "mky4ong.com");
obj.put("age", new Integer(100));
JSONObject obj2 = new JSONObject();
obj2.put("name", "mk54yong.com");
obj2.put("age", new Integer(1800));
file = new FileWriter(filename);
JSONArray list = new JSONArray();
list.add(obj);
list.add(obj2);
o.put("messages", list);
file.write(o.toJSONString());
file.flush();
file.close();
} catch (IOException ex) {logger.error("{}", ex.getCause());} finally {try {file.close();} catch (IOException ex) {logger.info("{}",ex.getCause());}}
}
と同じファイルからの読み込みにこのコードを使用して:
public void Load() {
JSONParser parser = new JSONParser();
Object obj = null;
try {
obj = parser.parse(new FileReader(filename));
} catch (IOException | ParseException ex) {logger.info("{}", ex.getCause());}
JSONObject jsonObject = (JSONObject) obj;
JSONArray msg = (JSONArray) jsonObject.get("messages");
Iterator<JSONObject> iterator = msg.iterator();
while (iterator.hasNext()) {
JSONObject ob = iterator.next();
String name =(String) ob.get("name");
Integer age =(Integer) ob.get("age");
logger.info("name: {}, age: {}", name, age);
}
}
}
しかし、データが{"messages":[{"name":"mky4ong.com","age":100},{"name":"mk54yong.com","age":1800}]}
として正常に書き込まれているが、私はロード中に問題があります。 この行でInteger age =(Integer) ob.get("age");
コンパイラは「スレッド内の例外」メイン「java.lang.ClassCastException:java.lang.Longをjava.lang.Integerにキャストできません」と述べています。
複数の方法でキャストしようとしましたが、動作しません。なぜこのようなエラーが起こるのですか?
PS:あなたはそれが発生したときにJSONParserが自動的Long
を使用します。あなたはそれを読んで、あなたの場合、あなたが使用Integer
タイプで(すべての追加情報が失われ、あなたのJSONファイルを書くとき、私はcompile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
例では_you_リンクしていますが、著者は「Integer」ではなく「Long」にキャストします... – njzk2
http://stackoverflow.com/questions/20869138/json-simple-get-an-integer-instead -of-longヘルプその質問は、まったく同じ問題ではありませんが、正確には重複していません。 – Alex
json-simpleは数値を 'java.lang.Number'のインスタンスにマップするので、適切なキャストは' Number.class.cast(ob.get( "age"))。intValue() '(テストされていません) –