【问题标题】:Retrofit 2 API Can I use local file path or json string instead of url?Retrofit 2 API 我可以使用本地文件路径或 json 字符串而不是 url 吗?
【发布时间】:2017-01-13 04:48:37
【问题描述】:

您好,我正在开发一个Android 应用程序,它使用retrofit API 从服务器获取响应。 Retrofit 自动解析 json 响应并创建 POJO 类的对象。我将该 json 存储到 sqlite 中,如果未连接互联网,则从 sqllite 调用 json,遇到困难必须手动解析 json。

我有什么方法可以使用改造库来解析 json 并从 json 字符串或文件路径中生成 pojo 吗?我的代码是从 url 获取的:

@FormUrlEncoded
@POST("getResponse")
Observable<UserResponse> getResponse(@Field("token") String token);

如果没有连接互联网,我想要这样的东西。

@FromStringEncoded
Observable<UserResponse> getResponseOffline(@Field("token") String token);

谢谢。

【问题讨论】:

    标签: java android json retrofit2


    【解决方案1】:

    你没有提到提议。当真正的服务器还不能工作时,我使用以下解决方案在应用程序中模拟服务器。

    所以你可以在 OkHttp 中使用拦截器。像这样:

    OkHttpClient.Builder builder = new OkHttpClient.Builder();       
    builder.addInterceptor(new MockClient(context));
    

    而 MockClient 看起来像这样:

    public class MockClient implements Interceptor {
    
        Context context;
    
        public MockClient(Context context) {
            this.context = context;
        }
    
        @Override
        public Response intercept(Chain chain) throws IOException {
    
            HttpUrl url = chain.request().url();
            Log.d("TAG","url="+url);
            //here determine what to do base on url.
            //e.g.:
            switch(url.encodedPath()) {
               case "some/path" :
                String response = readJsonFieleFromAssestOrAnyOtherStorage();
                return new Response.Builder()
                            .code(200)
                            .message(response)
                            .request(chain.request())
                            .protocol(Protocol.HTTP_1_1)
                                        .body(ResponseBody.create(MediaType.parse("application/json"), response.getBytes()))
                            .addHeader("content-type", "application/json")
                            .build();
            }
        }
    }
    

    【讨论】:

    • 如何将日志记录添加到您的自定义 MockClient?模拟客户端正在为我工​​作,但我没有看到任何日志。任何帮助,将不胜感激。谢谢
    • 您究竟希望记录什么?
    • 我想在 HttpLoggingInterceptor() 为您的 MockCleint 提供的内容中添加一些内容,并更改拦截器记录的级别。例如,我想记录请求和响应行,我可以通过 HttpLoggingInterceptor 中的这段代码来实现。 val logging = HttpLoggingInterceptor() logging.level = HttpLoggingInterceptor.Level.BODY
    • 在这个解决方案中,您必须自己实现它。我添加了一个可以放置日志的地方。
    【解决方案2】:

    只需使用Google's GSON 库,它允许您将json 转换为POJO,反之亦然。从sqlite 中获取json 并使用gson 解析它。

    Gson gson=new Gson();
    UserResponse userResponse= gson.fromJson(jsonInStringFromDb,UserResponse.class);
    

    您还可以使用Gson 从文件中解析JSON

    JSON 到 Java 对象,从文件中读取。

    Gson gson = new Gson();
    Staff staff = gson.fromJson(new FileReader("D:\\file.json"), Staff.class);
    

    【讨论】:

    • 我正在使用 gson.fromJson(cursor.getString(0),List.class); 需要像这样制作列表对象:List> 我该怎么做?
    • Gson gson=new Gson(); List> listResponse=gson.fromJson(cursor.getString(0),new TypeToken>>(){}.getType());
    • 我不喜欢这个答案。当使用普通的 Gson 时,你需要添加一些转换器到(你已经安装到你的项目的 gson 中)。正确的方法是拦截请求并将新的 json 放入响应中
    【解决方案3】:

    从本地 filesystem 使用它是没有意义的 - retrofit 用于 http requests。如果您只需要parse JSON,请使用GSONJackson- 这是RetroFit 用于parse json 的两个librarieslibraries 都相当容易使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      相关资源
      最近更新 更多