我正在使用改造高效的网络库,但无法处理包含单个前缀的Dynamic JSON,该前缀 responseMessage会object随机responseMessage更改,在某些情况下(动态),相同的前缀()会更改为String。
responseMessage
object
Json格式的responseMessage对象:
{ "applicationType":"1", "responseMessage":{ "surname":"Jhon", "forename":" taylor", "dob":"17081990", "refNo":"3394909238490F", "result":"Received" } }
responseMessage Json格式会动态更改为字符串类型:
{ "applicationType":"4", "responseMessage":"Success" }
我的问题是,由于改造具有内置的JSON解析,我必须为每个请求分配单个POJO!但是不幸的是,REST-API是基于动态JSON响应构建的。前缀将在 成功(…) 和 失败(…) 方法中从字符串随机更改为对象!
JSON
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(); } }); }
Pojo:
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 basics :)),所以我正在为JSONRetrofit中的动态寻找相同的解决方案。我知道这在具有异步任务的普通http客户端中是非常容易的工作,但这不是REST- Api JSON解析中的最佳实践!始终以性能为基准 Volley或Retrofit是最佳选择,但我无法动态处理JSON!
我知道可能的解决方案
在http客户端解析中使用旧的asyc任务。:(
尝试说服RESTapi后端开发人员。
创建自定义的改造客户端:)
晚会晚了,但是您可以使用转换器。
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);
然后,您使用一个静态类来实现改装的Converter:
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(); } }
我已经编写了此样本转换器,因此它以字符串,对象,JsonObject或Map <字符串,对象>的形式返回Json响应。显然,并非所有返回类型都适用于每个Json,并且肯定有改进的空间。但是它演示了如何使用Converter将几乎所有响应转换为动态Json。