2015-07-20 66 views
1

我正在使用拥有getter和setter的POJO类。但是,由于这种动态行为,我将被迫使用反序列化部分。我也已经实现了代码,但是还有其他方法可以解决这个问题。因为,下面粘贴响应是实际响应的仅有一小部分(这是大规模和我使用它POJO getter和setter)Retrofit - 处理具有动态结构的JSON密钥 - Array/Object

OBJECT

secondaryUser: { 
    id: 1, 
    username: "admin", 
    numberOfFollowers: 1, 
    displayName: "admin" 
    } 

ARRAY

secondaryUser: [ 
    { 
    id: 18150, 
    activityDateTime: "2015-07-20 14:46:02", 
    user: { 
    id: 1, 
    username: "admin", 
    numberOfFollowers: 1, 
    displayName: "admin" 
    } 
    }, 
    { 
    id: 18148, 
    activityDateTime: "2015-07-20 13:35:02", 
    user: { 
    id: 3, 
    username: "USER_1", 
    numberOfFollowers: 4, 
    displayName: "USER_1" 
    } 
    }, 
    { 
    id: 18146, 
    activityDateTime: "2015-07-20 11:29:41", 
    user: { 
    id: 2468, 
    username: "USER_2", 
    numberOfFollowers: 1, 
    displayName: "USER_2" 
    } 
    } 
    ] 
    } 

回答

2

我希望这能解决你的问题。

首先,你的情况,如果你已经声明secondaryUser为对象或数组,将其更改为List<SecondaryUser> secondaryUser

创建解串器。

DynamicJsonConverter.java

public class DynamicJsonConverter implements Converter { 

    private static String fromStream(InputStream in) throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     StringBuilder out = new StringBuilder(); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      out.append(line); 

     } 
     return out.toString(); 
    } 

    @Override 
    public Object fromBody(TypedInput typedInput, Type type) throws ConversionException { 
     try { 
      InputStream in = typedInput.in(); // convert the typedInput to String 
      String string = fromStream(in); 
      in.close(); // we are responsible to close the InputStream after use 
      return string; 

     } catch (Exception e) { // a lot may happen here, whatever happens 
      throw new ConversionException(e); // wrap it into ConversionException so retrofit can process it 
     } 

    } 

    @Override 
    public TypedOutput toBody(Object object) { // not required 
     return null; 
    } 
} 

你休息适配器类。

BasePathAdapterForDynamicJSONKeys.java

public class BasePathAdapterForDynamicJSONKeys { 
     private static RetroFitInterface topRecommendationsInterface; 

     public static RetroFitInterface getCommonPathInterface() { 

      RestAdapter restAdapter = new RestAdapter.Builder() 
        .setEndpoint(baseURL) 
        .setConverter(new DynamicJsonConverter()) 

        .build(); 
      topRecommendationsInterface = restAdapter.create(RetroFitInterface.class); 
      return topRecommendationsInterface; 
     } 

此外,使用回调为Callback<String>(),而不是Callback<YourObject>()

现在,你的活动/片段内,改造回调的成功方法中,使用此。

@Override 
public void success(String myData, Response response) { 
JSONObject mainObject = null; 
mainObject = new JSONObject(myData); 

//You can also use JSONObject, depends on what type the response is 

JSONArray myJsonArray = mainObject.getJSONArray("yourkey"); 

最后,这个倾倒你的ArrayList内部。(这基本上是JSON数组转换成ArrayList的:))

ArrayList<MyObj> menuDetails = new Gson().fromJson(myJsonArray.toString(), new TypeToken<List<MyObj>>(){}.getType());