2012-07-21 79 views
2

我使用google gson-2.2.1库来解析JSON的大型响应。Android:解析大型json响应

我必须解析一个JSON响应,其结构可能会有所不同。

第一种情况,当响应包含不止一个团队:

"Details":{ 

      "Role":"abc", 
      "Team":[ 
       { 
       "active":"yes", 
       "primary":"yes", 
       "content":"abc" 
       }, 
       { 
       "active":"yes", 
       "primary":"yes", 
       "content":"xyz" 
       } 
      ], 

第二种情况下,当只有一个团队传递:

"Details":{ 

      "Role":"abc", 
      "Team": 
       { 
       "active":"yes", 
       "primary":"yes", 
       "content":"abc" 
       } 
} 

有用于解析我的基类:

class Details { 
    public String Role; 
    public ArrayList<PlayerTeams> Team = new ArrayList<PlayerTeams>(); 
     PlayerTeams Team; // when JsonObject 
} 

class PlayerTeams { 
    public String active; 
    public String primary; 
    public String content; 
} 

问题是我不能使用ArrayList<PlayerTeams>当我只有其中一个nd将它作为JsonObject返回。

Gson可以识别JSON响应的静态格式。我可以通过检查“Team”键是否为JsonArrayJsonObject的实例来动态追踪完整响应,但如果有更好的解决方案可用,那么这将非常有用。

编辑: 如果我的回答更加动感..

"Details":{ 

     "Role":"abc", 
     "Team": 
      { 
      "active":"yes", 
      "primary":"yes", 
      "content":"abc" 
      "Test": 
      { 
       "key1":"value1", 
       "key2":"value2", 
       "key3":"value3" 
      } 
      } 
} 

在我编辑的问题,我面对的问题,而我的反应是更加动态.. TeamTest可以JsonArrayJsonObject。它确实骚扰我,因为有时候对象可能会在更多数据的时候数组,当单个数据时可能对象,当没有数据的时候可能是数组。回应没有一致性。

+0

如果你读JSONArray代替的JSONObject会发生什么?你有没有得到任何异常或null? – 2012-07-21 12:25:09

+0

如果您为JsonObject使用ArrayList,则Google Gson会抛出异常。 – 2012-07-21 12:27:35

+0

您可以尝试读取catch块中的JSONObject。 – 2012-07-21 12:28:51

回答

1

您需要一个类型适配器。这个适配器将能够区分哪种格式即将到来,并使用正确的值实例化正确的对象。

你可以这样做:

  1. 通过创建一个类实现JsonSerializer<List<Team>>, JsonDeserializer<List<Team>>,当然只是需要你需要序列化在此问题上过于情况下JsonSerializer实现自己的类型的适配器。
  2. 注册类型的适配器给你GsonBuilder喜欢:new GsonBuilder().registerTypeAdapter(new TypeToken<List<Team>>() {}.getType(), new CoupleAdapter()).create()

的反序列化方法可以是这样的:

public List<Team> deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) 
     throws com.google.gson.JsonParseException { 
    if (json.isJsonObject()) { 
     return Collections.singleton(context.deserialize(json, Team.class)); 
    } else { 
     return context.deserialize(json, typeOfT); 
    } 
} 
+0

我可以注册两个或更多'TypeAdapter'以获得较大的响应。我试过并进入无限循环。因为反序列化无限调用。我测试了 – 2012-10-17 07:56:56

+0

你的目标是什么? – 2012-10-17 08:29:11

+0

请参阅...问题已编辑 – 2012-10-17 09:15:58