在Android中使用GSON来解析复杂的JSON对象

waj*_*jiw 14 serialization parsing android json gson

我对Java编程比较陌生,需要跨线程解析复杂的JSON对象.过去一天我一直在阅读有关GSON的文档,并且没有太多运气可以完全解析这种类型的结构:

{
  'Events' : [{
    'name' : 'exp',
    'date' : '10-10-2010',
    'tags' : ["tag 1", "tag2", "tag3"]
    },...more events...],
  'Contacts' : [{
    'name' : 'John Smith',
    'date' : '10-10-2010',
    'tags' : ["tag 1", "tag2", "tag3"]
    },...more contacts...],
}
Run Code Online (Sandbox Code Playgroud)

我已经能够让它与这个问题类似地工作,但无法弄清楚如何让额外的阵列级别工作.

waj*_*jiw 18

使用我正在寻找的格式的GSON的正确方法是:

//somewhere after the web response:
Gson gson = new Gson();

Event[] events = gson.fromJson(webServiceResponse,  Event[].class);


//somewhere nested in the class:
static class Event{
    String name;
    String date;

    public String getName()
    {
        return name;
    }

    public String getDate()
    {
        return date;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public void setDate(String date)
    {
        this.date = date;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在JSONArray of Events中还有一个JSONArray有名称标签?那么请你澄清一下如何使用这个Event类来获取标签JSONArray? (2认同)

Ung*_*viu 7

Java有自己的JSON解析器:我们也可以在Android上使用它.

您可以在下面找到如何从String获取所有事件.

String TAG        = "JSON EXAMPLE";
    String jsonString = "{\"Events\" : [{\"name\" : \"exp\",\"date\" : \"10-10-2010\",\"tags\" : [\"tag 1\",\"tag 2\",\"tag 3\"]}],\"Contacts\" : [{\"name\" : \"John Smith\",\"date\" : \"10-10-2010\",\"tags\" : [\"tag 1\",\"tag 2\",\"tag 3\"]}]}";

    try {
        JSONObject jsonObj    = new JSONObject(jsonString);     // create a json object from a string
        JSONArray  jsonEvents = jsonObj.getJSONArray("Events"); // get all events as json objects from Events array

        for(int i = 0; i < jsonEvents.length(); i++){
            JSONObject event = jsonEvents.getJSONObject(i); // create a single event jsonObject
            Log.e(TAG, "Event name:" + event.getString("name") + " date: " + event.getString("date"));


            JSONArray eventTags = event.getJSONArray("tags");

            for(int j = 0; j < eventTags.length(); j++){
                Log.e(TAG, "Event tag: " + eventTags.getString(j));
            }

        }           

    } catch (JSONException e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

请注意:您的JSON对象(来自您的问题)将抛出异常,因为它无效(我不确定,但它看起来像一个javascript对象).你必须为每个属性(键)添加一些引号并用\(\")来表示它们.
这个工具非常适合测试JSON字符串是否有效.

  • OP询问如何使用GSON,这比直接使用内置的JSON解析器要方便得多.你的答案非常好,但不适合这个特殊的问题 (6认同)