0
{
    "status":1,
    "list":
        {
            "218888771":
                {
                    "item_id":"218888771",
                    "title":"twitter",
                    "url":"http:\/\/t.co\/oFYGY7z0",
                    "time_updated":"1347094862",
                    "time_added":"1347094862",
                    "state":"0"
                },
            "217345740":
                {
                    "item_id":"217345740",
                    "title":"",
                    "url":"http:\/\/t.co\/dCvNwtrK",
                    "time_updated":"1346790837",
                    "time_added":"1346790700",
                    "state":"0"
                }
        },
    "since":1347094862,
    "complete":1
}

私はGoogleGSonを使用していますが、実際にはどこにも行きません。

まず第一に、なぜそれをJsonArrayとしてキャストできないのか混乱しています。「リスト」はjson配列のように見えます。しかし、それはうまくいかないようです。POJOメソッドを使用してもかまいませんが、最初にこのJSONArrayを解析するにはどうすればよいですか?

  JsonParser parser = new JsonParser();
    JsonElement tradeElement = parser.parse(response);
    JsonObject trade = tradeElement.getAsJsonObject();
    json.get("list").getAsJsonObject().get("url")

それは私にヌルを与えました。

4

2 に答える 2

1
 {
   "complete":1,
   "list":{
      "217345740":{
         "item_id":"217345740",
         "state":"0",
         "time_added":"1346790700",
         "time_updated":"1346790837",
         "title":"",
         "url":"http://t.co/dCvNwtrK"
      },
      "218888771":{
         "item_id":"218888771",
         "state":"0",
         "time_added":"1347094862",
         "time_updated":"1347094862",
         "title":"twitter",
         "url":"http://t.co/oFYGY7z0"
      }
   },
   "since":1347094862,
   "status":1
}

ご覧のとおり、これが適切にフォーマットされているのは、2つのプロパティと。listを持つオブジェクトです。配列は括弧で囲まれています。これが、配列としてキャストできない理由です。217345740218888771[]

最善の選択は、gsonとjsonをPOJOに解析する機能を正しく使用することです。これは完全にテストされていません(私はGsonをあまり知らず、開発マシンを使用していません)が、アイデアはわかります。

public class Item {
    long item_id;
    int state;
    @SerializedName("time_added")
    Date timeAdded;
    @SerializedName("time_updated")
    Date timeUpdated;
    String title;
    String url;

    // getter & setters
}

public class Trade {
    int complete;
    Date since;
    int status;
    Map<Long, Item> list;

    // getter & setters
}

public class Foo {
    public static void main(String[] args) {
        String json = "";

        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
            public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
                return new Date(json.getAsJsonPrimitive().getAsLong()); 
            } 
        });
        Gson gson = builder.create();
        Trade trade = gson.fromJson(json, Trade.class);
        Map<Long, Item> items = trade.getList();
        System.out.println(items.get(217345740L).getUrl()); // should print http://t.co/dCvNwtrK
    }
}
于 2012-09-08T19:00:40.307 に答える
0

JSON配列は次のようになります。

[
    {
        "item_id":"218888771",
        "title":"twitter",
        "url":"http:\/\/t.co\/oFYGY7z0",
        "time_updated":"1347094862",
        "time_added":"1347094862",
        "state":"0"
    },
    {
        "item_id":"218888771",
        "title":"twitter",
        "url":"http:\/\/t.co\/oFYGY7z0",
        "time_updated":"1347094862",
        "time_added":"1347094862",
        "state":"0"
    },
]

上記はマップのJSONArrayです。データはマップのマップであるため、適切なキーを使用してマップを参照し、「url」キーを使用して最も内側のマップに到達する必要があります。

于 2012-09-08T19:02:14.137 に答える