Android アプリでかなり大きな json を解析する必要があります。オンラインで読んだことから、Jackson が必要です。
私が見る限り、jackson の使用方法に誤りがあるとは思いませんが、オブジェクトを作成しようとすると何か問題が発生します...メモリが不足している可能性があります...または IDK.
私のジャクソンコード:
public void renderProducts(String url, JSONArray ja, AjaxStatus status) throws JSONException, JsonParseException, IOException {
if(ja == null) return;
ArrayList<Product> list = new ArrayList<Product>();
// new code
JsonFactory jfactory = new JsonFactory();
JsonParser jParser = jfactory.createJsonParser(ja.toString());
// loop until token equal to "]"
while (jParser.nextToken() != JsonToken.END_ARRAY) {
String fieldname = jParser.getCurrentName();
String name = null;
if ("name".equals(fieldname)) {
// current token is "name",
// move to next, which is "name"'s value
jParser.nextToken();
name = jParser.getText(); // display mkyong
System.out.println(name);
}
fieldname = jParser.getCurrentName();
String description = null;
if ("description".equals(fieldname)) {
// current token is "name",
// move to next, which is "name"'s value
jParser.nextToken();
description = jParser.getText(); // display mkyong
System.out.println(description);
}
fieldname = jParser.getCurrentName();
String sizes [] = null;
if ("sizes".equals(fieldname)) {
// current token is "name",
// move to next, which is "name"'s value
jParser.nextToken();
sizes = jParser.getText().split("##"); // display mkyong
System.out.println(sizes.toString());
}
String prices [] = null;
fieldname = jParser.getCurrentName();
if ("prices".equals(fieldname)) {
// current token is "name",
// move to next, which is "name"'s value
jParser.nextToken();
prices = jParser.getText().split("##"); // display mkyong
System.out.println(prices.toString());
}
fieldname = jParser.getCurrentName();
String picUrl = null;
if ("pic_url".equals(fieldname)) {
// current token is "name",
// move to next, which is "name"'s value
jParser.nextToken();
picUrl = jParser.getText(); // display mkyong
System.out.println(picUrl);
}
fieldname = jParser.getCurrentName();
String bigPicURL = null;
if ("big_pic_url".equals(fieldname)) {
// current token is "name",
// move to next, which is "name"'s value
jParser.nextToken();
bigPicURL = jParser.getText(); // display mkyong
System.out.println(bigPicURL);
}
Product p = new Product(name, sizes.toString(), description, prices.toString(),picUrl,bigPicURL,"");
list.add(p);
p = null;
}
最後の 3 行をコメント アウトすると (そのため、Product オブジェクトのリストを作成しません)、コードは機能します...基本的には、json からの正しい情報がコンソールに表示されます..しかし、 i の最後の 3 行で次のエラーが発生します。
07-07 13:48:12.514: W/AQuery(1389): reporting:java.lang.reflect.InvocationTargetException
07-07 13:48:12.514: W/AQuery(1389): at java.lang.reflect.Method.invokeNative(Native Method)
07-07 13:48:12.514: W/AQuery(1389): at java.lang.reflect.Method.invoke(Method.java:511)
07-07 13:48:12.514: W/AQuery(1389): at com.androidquery.util.AQUtility.invokeMethod(AQUtility.java:200)
07-07 13:48:12.514: W/AQuery(1389): at com.androidquery.util.AQUtility.invokeHandler(AQUtility.java:177)
07-07 13:48:12.514: W/AQuery(1389): at com.androidquery.callback.AbstractAjaxCallback.callback(AbstractAjaxCallback.java:496)
07-07 13:48:12.514: W/AQuery(1389): at com.androidquery.callback.AbstractAjaxCallback.afterWork(AbstractAjaxCallback.java:1261)
07-07 13:48:12.514: W/AQuery(1389): at com.androidquery.callback.AbstractAjaxCallback.run(AbstractAjaxCallback.java:986)
07-07 13:48:12.514: W/AQuery(1389): at android.os.Handler.handleCallback(Handler.java:605)
07-07 13:48:12.514: W/AQuery(1389): at android.os.Handler.dispatchMessage(Handler.java:92)
07-07 13:48:12.514: W/AQuery(1389): at android.os.Looper.loop(Looper.java:137)
07-07 13:48:12.514: W/AQuery(1389): at android.app.ActivityThread.main(ActivityThread.java:4424)
07-07 13:48:12.514: W/AQuery(1389): at java.lang.reflect.Method.invokeNative(Native Method)
07-07 13:48:12.514: W/AQuery(1389): at java.lang.reflect.Method.invoke(Method.java:511)
07-07 13:48:12.514: W/AQuery(1389): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-07 13:48:12.514: W/AQuery(1389): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-07 13:48:12.514: W/AQuery(1389): at dalvik.system.NativeStart.main(Native Method)
07-07 13:48:12.514: W/AQuery(1389): Caused by: java.lang.NullPointerException
07-07 13:48:12.514: W/AQuery(1389): at com.testehan.feedme.Activity.Main.renderProducts(Main.java:322)
07-07 13:48:12.514: W/AQuery(1389): ... 16 more
322行目は次のとおりです。
Product p = new Product(name, sizes.toString(), description, prices.toString(),picUrl,bigPicURL,"");
この問題をどのように処理できるかについてのアイデアはありますか? または、ジャクソンのアプローチのどこに私の間違いがありますか?
ありがとう
更新:私が使用するコードはhttp://www.mkyong.com/java/jackson-streaming-api-to-read-and-write-json/からのものです。彼のコードとファイルを試してみると、期待どおりに動作します..しかし、インターネットからjsonを取得すると..問題が発生します..
キーと値のペアの順序が変わるためでしょうか。