改造 - 处理具有动态结构的 JSON 键 - Array/Object
Retrofit - handle JSON key which has a dynamic structure - Array/Object
我正在使用具有 getter 和 setter 的 POJO 类。但是,由于这种动态行为,我将被迫使用反序列化部分。我也为此实现了代码,但是还有其他方法可以处理这个问题。因为,下面粘贴的响应只是实际响应的一小部分(它很大,我正在使用 POJO getters 和 setters)
对象
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;
}
}
你的休息适配器class。
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 中,在改造回调的成功方法中,使用这个。
@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<MyObj> menuDetails = new Gson().fromJson(myJsonArray.toString(), new TypeToken<List<MyObj>>(){}.getType());
我正在使用具有 getter 和 setter 的 POJO 类。但是,由于这种动态行为,我将被迫使用反序列化部分。我也为此实现了代码,但是还有其他方法可以处理这个问题。因为,下面粘贴的响应只是实际响应的一小部分(它很大,我正在使用 POJO getters 和 setters)
对象
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;
}
}
你的休息适配器class。
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 中,在改造回调的成功方法中,使用这个。
@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<MyObj> menuDetails = new Gson().fromJson(myJsonArray.toString(), new TypeToken<List<MyObj>>(){}.getType());