android - 如何在改造中处理动态 JSON?

我正在使用改造高效网络库,但我无法处理包含单个前缀 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!

我知道的可能解决方案

  1. 在 http 客户端解析中使用旧的 asyc 任务。 :(

  2. 尝试说服 RESTapi 后端开发人员。

  3. 创建自定义 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 形式返回 Json 响应。显然,并非所有返回类型都适用于每个 Json,并且肯定有改进的余地。但它演示了如何使用 Converter 将几乎所有响应转换为动态 Json。

https://stackoverflow.com/questions/24279245/

相关文章:

json - 将 Go map 转换为 json

python - 不是 JSON 可序列化的

javascript - JSON 安全最佳实践?

python - 如何在 Django 中不使用模板返回 JSON?

jquery - jQuery 1.4.1 中缺少 JSON 字符串化?

xml - json和xml有什么区别

json - Postgres : How to convert a json string to

c# - 使用 JObject 即时创建 JSON

c# - 从 HTTPClient 响应中解压 GZip 流

json - Emacs 模式编辑 JSON