私はアンドロイドアプリケーションを開発中で、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>)
うまくいけば、あなたは私がこの最後の問題を整理することができ、私が手にエラーが発生し、それが上を示していることラインと一緒に以下の通りです助けてくれてありがとう。
イテレータに入れた行 iterator = users.getElements();次のエラーが表示されます。ArrayNode型のメソッドgetElements()が未定義です –
user723858
提案の実装に関する詳細を質問に更新しました。ありがとう – user723858
@ user723858 - どのバージョンのjacksonを使用していますか?私は1.9.9でテストしました – Qwerky