2016-10-12 5 views
3

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'

+0

例では_you_リンクしていますが、著者は「Integer」ではなく「Long」にキャストします... – njzk2

+0

http://stackoverflow.com/questions/20869138/json-simple-get-an-integer-instead -of-longヘルプその質問は、まったく同じ問題ではありませんが、正確には重複していません。 – Alex

+0

json-simpleは数値を 'java.lang.Number'のインスタンスにマップするので、適切なキャストは' Number.class.cast(ob.get( "age"))。intValue() '(テストされていません) –

答えて

3

を使用しています小数点のない数の読者にLongを使用してみてくださいリーダーライターについてを知らないことに注意してくださいそれが唯一のファイルを読み込み、それが適当と考えるようにそれを解釈することができます

だから、あなたの質問に答えるために:。。。。

Long age =(Long) ob.get("age"); 

となります。

+0

これは非常に奇妙です。以前のプログラムでJSON配列の数値だけを読み込んでキャストをlongにしてもうまくいきませんでした。しかし、ありがとう! – Nav

関連する問題