解析json(Ion)是不可能的

时间:2014-12-22 05:52:28

标签: android android-json ion

我使用我的图书馆项目enter link description here

作者举了一个例子:

public static class Tweet {
    public String id;
    public String text;
    public String photo;
}

public void getTweets() throws Exception {
    Ion.with(context)
    .load("http://example.com/api/tweets")
    .as(new TypeToken<List<Tweet>>(){})
    .setCallback(new FutureCallback<List<Tweet>>() {
       @Override
        public void onCompleted(Exception e, List<Tweet> tweets) {
          // chirp chirp
        }
    });
}

我确实效仿他的榜样。但不清楚数据以什么形式出现在例子中。 我举了例子:

public static class Test {
        public String name;
        public String soname;
        public String age;
        public String country;
    }
    private void setData(){
        Ion.with(getActivity())
                .load("http://........")
                .as(new TypeToken<List<Test>>(){})
                .setCallback(new FutureCallback<List<Test>>() {
                    @Override
                    public void onCompleted(Exception e, List<Test> result) {
                        // do stuff with the result or error
                        Toast.makeText(getActivity(), result.get(0).name, Toast.LENGTH_LONG).show();
                    }
                });
    }

但是收到错误:

12-22 05:46:59.609      414-414/com.testlist.pavel.transportercity E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at com.testlist.pavel.transportercity.Fragments.Kitchen_list_of_orders$1.onCompleted(Kitchen_list_of_orders.java:49)
            at com.testlist.pavel.transportercity.Fragments.Kitchen_list_of_orders$1.onCompleted(Kitchen_list_of_orders.java:45)
            at com.koushikdutta.async.future.SimpleFuture.handleCallbackUnlocked(SimpleFuture.java:79)
            at com.koushikdutta.async.future.SimpleFuture.setComplete(SimpleFuture.java:105)
            at com.koushikdutta.ion.IonRequestBuilder$1.run(IonRequestBuilder.java:215)
            at com.koushikdutta.async.AsyncServer$RunnableWrapper.run(AsyncServer.java:171)
            at android.os.Handler.handleCallback(Handler.java:587)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:130)
            at android.app.ActivityThread.main(ActivityThread.java:3683)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:507)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
            at dalvik.system.NativeStart.main(Native Method)

有助于了解问题是什么?我从服务器回答:

{"name":"Vasya","soname":"Pupkin","age":"25","country":"Russian Federation"}{"name":"Iliya","soname":"Strelnikov","age":"43","country":"Kazahstan"}

也许不是正确的数据格式,图书馆也无法理解?

1 个答案:

答案 0 :(得分:0)

Ion库希望从网址收到JsonArray。确保获得JsonArray。其次result.get(0).name有时会返回null pointer,原因是首先要检查请求中是否发生错误。这可以通过e方法中的参数onCompleted找到。然后,您需要先检查List是否包含元素,然后再将其发送到吐司,如果0th elementnot found,那么您将获得空指针错误。

onCompleted方法中执行类似下面的操作。

@Override
public void onCompleted(Exception e, List<Test> result) {

   //do stuff with the result or error
   String msg;
   if(e != null) {
       msg = "Error occured";
   }else if(result.size()>0){
       msg = "Received 0 elements";
   }else{
       msg = result.get(0).name;
   }

   Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show();
}