我正在使用改造高效网络库,但我无法处理包含单个前缀 responseMessage
的动态 JSON,该前缀随机更改为 object
,相同的前缀 (responseMessage
) 在某些情况下(动态地)更改为 String。
responseMessage的Json格式对象:
{
"applicationType":"1",
"responseMessage":{
"surname":"Jhon",
"forename":" taylor",
"dob":"17081990",
"refNo":"3394909238490F",
"result":"Received"
}
}
responseMessage
Json 格式动态变化为字符串类型:
{
"applicationType":"4",
"responseMessage":"Success"
}
我的问题是由于改造具有内置的 JSON
解析,我必须为每个请求分配单个 POJO!但不幸的是,REST-API 是建立在动态 JSON
响应之上的。在 success(...) 和 failure(...) 方法中,前缀将随机从字符串变为对象!
void doTrackRef(Map<String, String> paramsref2) {
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint("http://192.168.100.44/RestDemo").build();
TrackerRefRequest userref = restAdapter.create(TrackerRefRequest.class);
userref.login(paramsref2,
new Callback<TrackerRefResponse>() {
@Override
public void success(
TrackerRefResponse trackdetailresponse,
Response response) {
Toast.makeText(TrackerActivity.this, "Success",
Toast.LENGTH_SHORT).show();
}
@Override
public void failure(RetrofitError retrofitError) {
Toast.makeText(TrackerActivity.this, "No internet",
Toast.LENGTH_SHORT).show();
}
});
}
波乔:
public class TrackerRefResponse {
private String applicationType;
private String responseMessage; //String type
//private ResponseMessage responseMessage; //Object of type ResponseMessage
//Setters and Getters
}
在上面的代码中,POJO TrackerRefResponse.java 前缀 responseMessage 设置为 string 或 responseMessage 类型的对象,因此我们可以使用具有相同名称的 ref 变量创建 POJO(java 基础 :))所以我正在寻找相同的动态解决方案JSON
在改造中。
我知道这在具有异步任务的普通 http 客户端中非常容易,但这不是 REST-Api JSON
解析的最佳实践!看性能Benchmarks总是 Volley 或 Retrofit 是最好的选择,但我无法处理动态 JSON
!
我知道的可能解决方案
在 http 客户端解析中使用旧的 asyc 任务。 :(
尝试说服 RESTapi 后端开发人员。
创建自定义 Retrofit 客户端 :)
最佳答案
聚会迟到了,但你可以使用转换器。
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://graph.facebook.com")
.setConverter(new DynamicJsonConverter()) // set your static class as converter here
.build();
api = restAdapter.create(FacebookApi.class);
然后你使用一个实现改造转换器的静态类:
static class DynamicJsonConverter implements Converter {
@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
if (String.class.equals(type)) {
return string;
} else {
return new Gson().fromJson(string, type); // convert to the supplied type, typically Object, JsonObject or Map<String, Object>
}
} 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;
}
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);
out.append("\r\n");
}
return out.toString();
}
}
我编写了这个示例转换器,因此它以 String、Object、JsonObject 或 Map
https://stackoverflow.com/questions/24279245/