2017-04-20 52 views
0

我正在致力于一个需要从本地Android资产目录访问Json数据的项目。我可以使用Volley Library阅读资产文件夹中的json数据,但我想用改装来做同样的事情。以下是我的json文件 - myfile.json使用改进方法从(本地)android资产文件夹获取Json数据

{ 
    "formules": [ 
    { 
     "formule": "Linear Motion", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Constant Acceleration Motion", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Projectile Motion", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Force", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Work, Power, Energy", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Rotary Motion", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Harmonic Motion", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Gravity", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Lateral and Longitudinal Waves", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Sound Waves", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Electrostatics", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Direct Current", 
     "url": "<html><body>You scored <b>192</b> points. <img src=\"http://192.168.1.46/shanta_holdings/img/images/project-thumbs/Glasshouse-1.jpg\" alt=\"Smiley face\"/></body></html> ", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Magnetic Field", 
     "url": "https://www.google.com/", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Alternating Current", 
     "url": "https://www.google.com/", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Thermodynamics", 
     "url": "https://www.google.com/", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Hydrogen Atom", 
     "url": "https://www.google.com/", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Optics", 
     "url": "https://www.google.com/", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Modern Physics", 
     "url": "https://www.google.com/", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Hydrostatics", 
     "url": "https://www.google.com/", 
     "des":"Here is a description" 
    }, 
    { 
     "formule": "Astronomy", 
     "url": "https://www.google.com/", 
     "des":"Here is a description" 
    } 
    ] 
} 

我搜索了一个星期,但没有得到任何适合的改造解决方案。我可以使用Retrofit从服务器读取数据。有什么方法可以使用改造来实现这一要求。

+2

我觉得Volly和改造用于其他API不从资源文件夹,使用GSON转换JSON解析。 –

+1

我有一个问题:**为什么?**为什么你想在不应该使用Volley和Retrofit的地方使用?为什么你不想直接加载文件? –

回答

0

正如Dheerubhai写道Retrofit不用于解析JSON对象。您可以使用GSON,请参见this thread以了解如何使其与Retrofit配合使用,您可以看到this tutorial

+0

我能够通过改进从服务器检索数据。你可能不清楚我的问题。我想从本地文件中检索json数据,而不是从url中获取数据。 –

+0

我明白了,但第一个链接包含从本地存储的JSON文件中检索数据的示例。 – gonczor

0

您正试图在您的项目中实施存根。

添加您以.json文件到RES /生/ filename.json

上面的示例显示了两个Web服务端点本地存根文件 - /一些/网络/服务/其它/网络/服务)和两个场景 - 空的和默认的(默认存根没有前缀,空存根以“empty_”为前缀)。这些文件的内容通常是JSON。

接下来我们编写一个自定义的HTTP客户端从这些本地文件而不是网络中获取。以下示例从Square的Retrofit库实现Client对象。如果您对Retrofit不熟悉,则默认的客户端实现为OkClient。它发出一个标准的HTTP网络请求。我们正在编写一个自定义客户端来伪造网络请求,并从本地文件而不是网络服务器获取响应数据。

上面的示例显示了两个Web服务端点(/ some/web/service,/ another/web/service)的本地存根文件以及两个方案 - empty和default(默认存根没有前缀,并且空stub前缀通过“empty_”)。这些文件的内容通常是JSON。

接下来我们编写一个自定义的HTTP客户端从这些本地文件而不是网络中获取。以下示例从Square的Retrofit库实现Client对象。如果您对Retrofit不熟悉,则默认的客户端实现为OkClient。它发出一个标准的HTTP网络请求。我们正在编写一个自定义客户端来伪造网络请求,并从本地文件而不是网络服务器获取响应数据。

public class LocalStubClient implements Client { 
    private Context context; 
    private String scenario; 

    public LocalStubClient(Context context, String scenario) { 
     this.context = context; 
     this.scenario = scenario; 
    } 

    public LocalStubClient(Context context) { 
     this.context = context; 
    } 

    public void setScenario(String scenario) { 
     this.scenario = scenario; 
    } 

    @Override 
    public Response execute(Request request) throws IOException { 
     //get resource id for local file 
     String fileName = createFilename(request, scenario); 
     int resourceId = getResourceId(fileName); 
     if (resourceId == 0) { //fallback to default filename 
      fileName = createFilename(request, null); 
      resourceId = getResourceId(fileName); 
      if (resourceId == 0) { 
       throw new IOException("Could not find res/raw/" + fileName + ".stub"); 
      } 
     } 

     //get input stream & mime for local file 
     InputStream inputStream = context.getResources().openRawResource(resourceId); 
     String mimeType = URLConnection.guessContentTypeFromStream(inputStream); 

     //wrap local stream in retrofit objects 
     TypedInput body = new TypedInputStream(mimeType, inputStream.available(), inputStream); 
     Response response = new Response(request.getUrl(), 200, "Stub from res/raw/" + fileName, new ArrayList<Header>(), body); 
     return response; 
    } 

    private String createFilename(Request request, String scenario) throws IOException { 
     URL requestedUrl = new URL(request.getUrl()); 
     String requestedMethod = request.getMethod(); 
     String prefix = scenario == null ? "" : scenario + "_"; 
     String filename = prefix + requestedMethod + requestedUrl.getPath(); 
     filename = filename.replace("/", "_").replace("-", "_").toLowerCase(); 
     return filename; 
    } 

    private int getResourceId(String filename) { 
     return context.getResources().getIdentifier(filename, "raw", context.getPackageName()); 
    } 

    private static class TypedInputStream implements TypedInput { 
     private final String mimeType; 
     private final long length; 
     private final InputStream stream; 

     private TypedInputStream(String mimeType, long length, InputStream stream) { 
      this.mimeType = mimeType; 
      this.length = length; 
      this.stream = stream; 
     } 

     @Override 
     public String mimeType() { 
      return mimeType; 
     } 

     @Override 
     public long length() { 
      return length; 
     } 

     @Override 
     public InputStream in() throws IOException { 
      return stream; 
     } 
    } 
} 

最后,我们检查我们的“后端环境”设置来确定是否应该用我们的LocalStubClient或默认OkClient:

RestAdapter.Builder builder = new RestAdapter.Builder(); 

String selectedBackend = getSharedPreference(R.string.pref_backend, ""); 
switch (Integer.parseInt(selectedBackend)) { 
    case R.string.test_server: 
    case default: 
     builder.setClient(new OkClient()); 
     builder.setEndpoint("http://test.api.mydomain.com"); 
     break; 
    case R.string.demo_server: 
     builder.setClient(new OkClient()); 
     builder.setEndpoint("http://demo.api.mydomain.com"); 
     break; 
    case R.string.default_local_stubs: 
     builder.setClient(new LocalStubClient(app)); 
     break; 
    case R.string.empty_local_stubs: 
     builder.setClient(new LocalStubClient(app, "empty")); 
     break; 
} 

RestAdapter adapter = builder.build(); 

模拟网络延迟和失败 改造也使我们能够模拟网络延迟,差异和故障。这里的代码启用/禁用基于我们的第二个开发设置一个模拟的网络适配器:

RestAdapter.Builder builder = new RestAdapter.Builder(); 

//... 

RestAdapter adapter = builder.build(); 

if (getSharedPreference(R.string.pref_mock_network, false)) { 
    MockRestAdapter mockRestAdapter = MockRestAdapter.from(adapter); 
    mockRestAdapter.setDelay(1000); 
    mockRestAdapter.setVariancePercentage(50); 
    mockRestAdapter.setErrorPercentage(10); 
    return mockRestAdapter.create(serviceType, adapter.create(serviceType)); 
} 
return adapter.create(serviceType) 
+0

感谢您的回复。让我试试你的解决方案,我会让你知道。 –

相关问题