0

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を取得すると..問題が発生します..

キーと値のペアの順序が変わるためでしょうか。

4

1 に答える 1

0

JSON をサポートするXStreamの代わりに、Jacksonを使用しません。

    Product product = new Product("Banana", "123", 23.00);
    com.thoughtworks.xstream.XStream xstream = new XStream(new com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver());
    xstream.setMode(com.thoughtworks.xstream.XStream.NO_REFERENCES);
    xstream.alias("product", Product.class);

    System.out.println(xstream.toXML(product));

上記のコードは次のようになります。

{"product":{"name":"Banana","id":123,"price":23.0}}

さらにサポートが必要な場合はお知らせください。

リンクされたページには、逆のコードもありますが、次のとおりです。

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
    // crap here
    XStream xstream = new XStream(new JettisonMappedXmlDriver());
    xstream.alias("product", Product.class);
    Product product = (Product)xstream.fromXML(json);

また、XStream は、JSON と XML の両方を使用してコレクションを透過的に処理することにも注意してください。

于 2013-07-07T17:59:26.017 に答える