0

私は GSON を使用して JSON データを解析しています。現在、私のアプリはこれで Google Geocoder を解析できます。しかし、別のWebサイトからJSONを解析しようとすると、nullpointerexceptionが発生します

これは、GSON とWeb サイトを接続する EventResponse クラスです。

public class EventResponse {
    public Meta meta;
    public Objects[] Objects;

    public EventResponse() {}

    public class Meta {
        public int limit;
        public String next;
        public int offset;
        public String previous;
        public int total_count;
    }

    public class Objects {
        public String category;
        public String date;
        public String description;
        public int id;
        public String name;
        public String resource_uri;
        public String venue;
    }
}

これはJSONです

{
    "meta": {
        "limit": 20,
        "next": null,
        "offset": 0,
        "previous": null,
        "total_count": 7
    },
    "objects": [
        {
            "category": "/api/v1/category/1/",
            "date": "2013-05-01",
            "description": "Beş yakın arkadaş, ", //Description is longer in real
            "id": 10,
            "name": "Kötü Ruh / Evil Dead",
            "resource_uri": "/api/v1/event/10/",
            "venue": "/api/v1/venue/3/"
        },
        {
            "category": "/api/v1/category/1/",
            "date": "2013-05-02",
            "description": "Filmde, küçümseyen, ",
            "id": 9,
            "name": "Korkunç Bir Film 5 / Scary Movie 5",
            "resource_uri": "/api/v1/event/9/",
            "venue": "/api/v1/venue/6/"
        }
    ]
}

これが私がGSONを使用する方法です(Objects [0]も試しましたが、問題ありませんでした)

Gson gson = new Gson();
        EventResponse eResult = new EventResponse();
        try {
            eResult = gson.fromJson(jsonCoord((catURL + Categories.catID)),
                    EventResponse.class);

            Log.i("ama"+eResult.Objects[1].category, "deneme");

jsonCoord メソッド

public String jsonCoord(String address) throws IOException {
        URL url = new URL(address);
        URLConnection connection = url.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                connection.getInputStream()));
        String inputLine;
        String jsonResult = "";
        while ((inputLine = in.readLine()) != null) {
            jsonResult += inputLine;
        }
        in.close();
        return jsonResult;
    }

ログからでも値を取得できません。エラー スタックは次のようになります: (行 59 はログ行です)

05-02 21:48:32.020: W/System.err(17456): java.lang.NullPointerException
05-02 21:48:32.030: W/System.err(17456):    at com.myapp.myapp.Events.getVenue(Events.java:59)
05-02 21:48:32.030: W/System.err(17456):    at com.myapp.myapp.Events.onCreate(Events.java:48)
05-02 21:48:32.030: W/System.err(17456):    at android.app.Activity.performCreate(Activity.java:5206)
05-02 21:48:32.030: W/System.err(17456):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083)
05-02 21:48:32.030: W/System.err(17456):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
05-02 21:48:32.030: W/System.err(17456):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
05-02 21:48:32.030: W/System.err(17456):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
05-02 21:48:32.030: W/System.err(17456):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
05-02 21:48:32.030: W/System.err(17456):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-02 21:48:32.030: W/System.err(17456):    at android.os.Looper.loop(Looper.java:137)
05-02 21:48:32.030: W/System.err(17456):    at android.app.ActivityThread.main(ActivityThread.java:4898)
05-02 21:48:32.030: W/System.err(17456):    at java.lang.reflect.Method.invokeNative(Native Method)
05-02 21:48:32.030: W/System.err(17456):    at java.lang.reflect.Method.invoke(Method.java:511)
05-02 21:48:32.030: W/System.err(17456):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
05-02 21:48:32.035: W/System.err(17456):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
05-02 21:48:32.035: W/System.err(17456):    at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

3

すでに指摘されているように、問題はフィールドの名前だけでした。

クラスでは名前は「オブジェクト」でしたが、JSON 応答では「オブジェクト」(小文字) です。プログラムと JSON の変数の名前はまったく同じでなければなりません。GSON を使用すると、JSON 応答から関心のあるフィールドのみを取得できるためです...したがって、応答に JSON 値が見つかった場合クラス属性のいずれにも対応していない場合、GSON はその値を無視します。

次のように、アノテーションを使用できます@SerializedName

@SerializedName("objects")
private Objects[] whateverName;

このようにして、クラスと JSON 応答で異なる名前を使用できます。

注: 属性のタイプは問題とは関係ありません。ObjectsJavaの命名規則に従うために、クラスは大文字で書く必要があります...

于 2013-05-02T21:19:50.747 に答える
2

問題は EventResponse クラスのオブジェクトの書き間違いでした

この解決済みの問題のように見せる

public class EventResponse {
    public Meta meta;
    public objects[] objects; //I also changed the type for it not to have any
trouble.

    public EventResponse() {}

    public class Meta {
        public int limit;
        public String next;
        public int offset;
        public String previous;
        public int total_count;
    }

    public class objects {
        public String category;
        public String date;
        public String description;
        public int id;
        public String name;
        public String resource_uri;
        public String venue;
    }
}
于 2013-05-02T20:30:33.300 に答える