改进-处理JSON键,它有一个动态结构-数组/对象



我使用有getter和setter的POJO类。然而,由于这种动态行为,我将被迫使用反序列化部分。我已经实现的代码,以及,但是有任何其他的方法来处理这个。因为,下面粘贴的响应只是实际响应的一小部分(这是大量的,我正在使用POJO getter和setter)

对象
 secondaryUser: {
    id: 1,
    username: "admin",
    numberOfFollowers: 1,
    displayName: "admin"
    }
数组

 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"
    }
    }
    ]
    }

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

首先,在您的情况下,如果您已声明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;
    }
}

Rest适配器类。

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>()

现在,在你的activity/fragment中,在retrofit回调的success方法中,使用this

@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");

最后,将其转储到数组列表中。(这基本上是JSON数组到arraylist的转换:))

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

最新更新