我正在开发一个需要从本地 android资源目录访问Json数据的项目。我可以使用 Volley Library 从assets文件夹中读取json数据,但我想使用 Retrofit 执行相同的操作。下面是我的json文件 - myfile.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从服务器读取数据。有没有办法通过改造来达到要求。
答案 0 :(得分:0)
正如Dheerubhai所写,Retrofit不用于解析JSON对象。您可以使用GSON,请参阅this thread了解如何使其与Retrofit配合使用,您可以看到this tutorial。
答案 1 :(得分:0)
您正在尝试在项目中实现存根。
将.json文件添加到res / raw / filename.json
上面的示例显示了两个Web服务端点的本地存根文件 - / some / web / service,/ another / web / service)和两个方案 - empty和default(其中默认存根没有前缀,空存根有前缀“empty_”)。这些文件的内容通常是JSON。
接下来,我们编写一个自定义HTTP客户端来从这些本地文件而不是网络中获取。以下示例从Square的Retrofit库实现Client对象。如果您不熟悉Retrofit,则默认的Client实现是OkClient。它生成标准的HTTP网络请求。我们正在编写一个自定义客户端来伪造网络请求,并从本地文件而不是网络服务器获取响应数据。
上面的示例显示了两个Web服务端点的本地存根文件 - / some / web / service,/ another / web / service)和两个方案 - empty和default(其中默认存根没有前缀,空存根有前缀“empty_”)。这些文件的内容通常是JSON。
接下来,我们编写一个自定义HTTP客户端来从这些本地文件而不是网络中获取。以下示例从Square的Retrofit库实现Client对象。如果您不熟悉Retrofit,则默认的Client实现是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;
}
}
}
最后,我们检查“Backend Environment”设置以确定是否应该使用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();
模拟网络延迟和故障 Retrofit还允许我们模拟网络延迟,差异和故障。这是基于我们的第二个Dev设置启用/禁用模拟网络适配器的代码:
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)