2013-09-06 15 views
5

私はアンドロイドアプリケーションを開発中で、JacksonのStream機能を使用していくつかのJavaデータの処理を実装しようとしています。これを行うには、いくつかのコード例を実行して、それぞれが行っていることを説明します。Jackson Mapperを使用したJSONデータのJava POJOクラスへのマッピング

{ 
"users": [ 
    { 
     "ID": "26", 
     "data1": "Momonth", 
     "data2": "2011-10-30 04:34:53" 
    }, 
    { 
     "ID": "45", 
     "data1": "Porto", 
     "data2": "2011-10-18 05:34:00" 
    }, 
    { 
     "ID": "21", 
     "data1": "Tomson", 
     "data2": "2011-10-12 02:44:13" 
    } 
], 
"success": 1, 
} 

次のコード、それは私のデータでは、「ユーザー」の配列リストの各項目を反復処理し、このデータが保存されますPOJOがされています:

ここ

は、私が働いているJSONであります
@JsonRootName(value = "users") 
public class User { 

    String ID; 
    String data1; 
    String data2; 
    ... 

    public String getID() { 
     return ID; 
    } 
    public void setID(String iD) { 
     ID = iD; 
    } 
    public String getData1() { 
     return data1; 
    } 
    public void setData1(String data1) { 
     this.data1 = data1; 
    } 
    public String getData2() { 
     return data2; 
    } 
    public void setData2(String data2) { 
     this.data2 = data2; 
    } 
    ... 

} 

私はJSONデータを見て、その後、オブジェクトの「ユーザー」配列リストをつかむことを期待するの下に、私は、今のところ、単純にそれを確認するためにLogCatに、各ユーザーの名前を印刷したい今のコードそれは動作し、以前に説明したように、データが ""非常に大きく、私は記憶上の問題を避けたい。

HttpRequest request = HttpRequest.get("http://www.site.com/android/app/getAllUsers.php"); 
final Reader reader = request.reader(); 
final ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 
final JsonFactory factory = mapper.getFactory(); 

try { 

    JsonParser jp = factory.createParser(reader); 

    while(jp.nextToken() == JsonToken.START_OBJECT) { 

     String fieldName = jp.getCurrentName(); 

     jp.nextToken(); 

     final User a = mapper.readValue(jp.getText(), User.class); 

    } 
} catch (JsonParseException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} catch (IOException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} 

上記のコードは、現在の状態では動作しませんし、私はジャクソンから、次のエラーを取得しかし:

09-06 11:11:25.326: W/System.err(15029): com.fasterxml.jackson.databind.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'users'), but FIELD_NAME 
09-06 11:11:25.326: W/System.err(15029): at [Source: [email protected]; line: 1, column: 2] 
09-06 11:11:25.326: W/System.err(15029): at com.fasterxml.jackson.databind.ObjectMapper._unwrapAndDeserialize(ObjectMapper.java:2948) 
09-06 11:11:25.326: W/System.err(15029): at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:2858) 
09-06 11:11:25.326: W/System.err(15029): at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1569) 
09-06 11:11:25.326: W/System.err(15029): at com.app.tool.UsersListActivity$LoadAllUsers.doInBackground(UsersListActivity.java:381) 
09-06 11:11:25.326: W/System.err(15029): at com.app.tool.UsersListActivity$LoadAllUsers.doInBackground(UsersListActivity.java:1) 
09-06 11:11:25.326: W/System.err(15029): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
09-06 11:11:25.326: W/System.err(15029): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
09-06 11:11:25.326: W/System.err(15029): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
09-06 11:11:25.326: W/System.err(15029): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
09-06 11:11:25.326: W/System.err(15029): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
09-06 11:11:25.326: W/System.err(15029): at java.lang.Thread.run(Thread.java:856) 

を私は本当に私はこの上で与えられる任意の助けをいただければ幸いです立ち往生し、前進することはできません。事前に

おかげ*


** ***EDIT ** ** * ** *


返事のおかげで、私はしかし、まだ動作していないようコードを実装しようとしたが、私が今持っているコードは以下の通りです:

protected String doInBackground(String... args) { 

    HttpRequest request = HttpRequest.get("http://www.site.com/android/app/getAllUsers.php"); 
    final Reader reader = request.reader(); 

    final ObjectMapper mapper = new ObjectMapper(); 
    final JsonFactory factory = mapper.getFactory(); 

    try { 

      JsonParser jp = factory.createParser(reader); 

      JsonNode root = mapper.readTree(jp); 
      ArrayNode users = (ArrayNode) root.path("users"); 

      Iterator<JsonNode> iterator = users.elements(); 

      while (iterator.hasNext()) { 
       User user = mapper.readValue(iterator.next(), User.class); 

       System.out.println("User Name = " + user.data1); 
      } 

     } catch (JsonParseException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     return null; 
} 

あなたはそれが私とは何かを持っていると思いますかASYNCタスクで実行中のプロセスか、Webサービスを通じてJSONにアクセスしていますか?

エラー行:

User user = mapper.readValue(iterator.next(), User.class); 

エラーコード:

The method readValue(JsonParser, Class<T>) in the type ObjectMapper is not applicable for the arguments (JsonNode, Class<User>) 

うまくいけば、あなたは私がこの最後の問題を整理することができ、私が手にエラーが発生し、それが上を示していることラインと一緒に以下の通りです助けてくれてありがとう。

答えて

1

@JsonRootName注釈は必要ありません。ツリーを読んでユーザ配列を取得するだけです。その後、各ノードで反復してObjectMapperreadValue(JsonNode node, Class<T> class)を使用します。

jsonの大文字のIDには、パーサーのヒントが必要なため、ゲッターの@JsonProperty(value="ID")アノテーションが必要です。

public class JacksonJSON { 

    public static void main(String[] args) throws Exception { 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonNode root = mapper.readTree(JacksonJSON.class.getResourceAsStream("/users.json")); 
     ArrayNode users = (ArrayNode) root.path("users"); 

     Iterator<JsonNode> iterator = users.getElements(); 
     while (iterator.hasNext()) { 
      User user = mapper.readValue(iterator.next(), User.class); 

      System.out.println("User id=" + user.id + " data1=" + user.data1 + " data2=" + user.data2); 
     } 


    } 

} 


class User { 

    String id; 
    String data1; 
    String data2; 

    @JsonProperty(value="ID") 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getData1() { 
     return data1; 
    } 

    public void setData1(String data1) { 
     this.data1 = data1; 
    } 

    public String getData2() { 
     return data2; 
    } 

    public void setData2(String data2) { 
     this.data2 = data2; 
    } 

} 
+0

イテレータに入れた行 iterator = users.getElements();次のエラーが表示されます。ArrayNode型のメソッドgetElements()が未定義です – user723858

+0

提案の実装に関する詳細を質問に更新しました。ありがとう – user723858

+0

@ user723858 - どのバージョンのjacksonを使用していますか?私は1.9.9でテストしました – Qwerky

関連する問題