从JSON或XML Feed导入数据并在Android中创建List

时间:2016-11-26 11:19:06

标签: java android json xml android-volley

我正在尝试制作一个Android类,用于创建其他应用的列表,供以后显示,直到现在我有以下代码用于创建列表(取自谷歌示例):

public final class AppList {

public static List<App> list;

public static List<App> setupApp() {
    list.add(buildAppInfo(
            "Browsers",
            "chrome",
            "description",
            "Google Inc.",
            "com.android.chrome",
            "http://...",
            "http://..."
    ));
    list.add(buildAppInfo(
            "Browsers",
            "Firefox",
            "description",
            "Mozilla",
            "com.mozilla.firefox",
            "http://...",
            "http://..."
    ));
    [An so on...]

    return list;
}

private static App buildAppInfo(String category,
                                    String title,
                                    String description,
                                    String developer,
                                    String packageName,
                                    String iconImageUrl,
                                    String bgImageUrl) {
    App app = new App();
    app.setId(App.getCount());
    App.incCount();
    app.setTitle(title);
    app.setDescription(description);
    app.setDeveloper(developer);
    app.setCategory(category);
    app.setIconImageUrl(iconImageUrl);
    app.setBackgroundImageUrl(bgImageUrl);
    app.setPackageName(packageName);
    return app;
    }
}
//From here everything is handled in other activity

我希望从Web服务器动态加载详细信息,我可以将其设置为提供JSONArray或XML,然后将这些数据放在列表中。对于我正在阅读的内容,我可以使用Volley,但我对Volley或Java一般都不是很有经验(我只是在路上学习)所以我不太了解如何继续。

在Google开发者网站上,我找到了example。我正在考虑添加这样的东西:

public final class AppList {

public static List<App> list;

public static List<App> setupApp() {
    /*Json Request*/
    String url = "https://json_url/";
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    list.add(response);//ADD ITEMS TO LIST HERE
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                }
            });

    return list;
}

private static App buildAppInfo(String category,
                                    String title,
                                    String description,
                                    String developer,
                                    String packageName,
                                    String iconImageUrl,
                                    String bgImageUrl) {
    App app = new App();
    app.setId(App.getCount());
    App.incCount();
    app.setTitle(title);
    app.setDescription(description);
    app.setDeveloper(developer);
    app.setCategory(category);
    app.setIconImageUrl(iconImageUrl);
    app.setBackgroundImageUrl(bgImageUrl);
    app.setPackageName(packageName);
    return app;
    }
}

从服务器Feed收到的数据应该是:

buildAppInfo(
            "Browsers",
            "Firefox",
            "description",
            "Mozilla",
            "com.mozilla.firefox",
            "http://...",
            "http://..."
    )
buildAppInfo(
            "Browsers",
            "Firefox",
            "description",
            "Mozilla",
            "com.mozilla.firefox",
            "http://...",
            "http://..."
    )
[...]
//BUT IN JSON FORMAT

我的整个方法显然不起作用。有人可以帮助我实现我的需求吗?谢谢。

1 个答案:

答案 0 :(得分:2)

您想要做的最简单的设置需要:

一种从URL读取内容,解析收到的JSON数组的方法。例如,进入JSONArray or JSONObject(您可以使用mvnrepository):

public static JSONArray parseJsonFromUrl(String uri) throws IOException, JSONException {
    JSONArray array = null;
    try (Scanner sn = new Scanner(new URL(uri).openStream(), "UTF-8")){
      array = new JSONArray(sn.useDelimiter("\\A").next());
    }
    return array;
}

将收到的信息映射到List个特定App个对象,例如:

public static List<App> getAppList(JSONArray array){
    List<App> appList = new ArrayList<>();
    for (int i = 0; i < array.length(); i++) {
            JSONObject object = array.getJSONObject(i);
            appList.add(buildAppInfo(object.getString("category"), object.getString("title"), object.getString("description"), object.getString("developer"), object.getString("packageName"), object.getString("iconImageUrl"), object.getString("bgImageUrl")));
    }
    return appList;
}

使用XML解析器的方法类似,使用XML解析器(详情请查看How to read XML response from a URL in java?)。

您可以使用更高级的工具(例如Jackson MapperSpring RestTemplate)来使用RESTful服务,但我建议您从这个简单的方法开始,直到您更熟悉Java生态系统。

<强> [UPDATE]

我使用此答案的代码制作了quick demo,以便您可以修补它。您还可以使用它作为样板来构建使用Spring Boot所需的休息服务。 (查看https://elcodedocle-jsontest.herokuapp.com/apps以获取最新传递的服务travisCI构建的实时部署)

<强> [ANOTHER_UPDATE]

如果您仍然无能为力,这里有一个完整的Android应用消费一个列表(&#34; app&#34; json对象的json数组)服务通过RESTful服务,使用从Android应用程序这个答案写的代码(是的,你可以将这个作为一个功能齐全的android工作室项目导入):https://github.com/elcodedocle/android-resttest

请记住,这是一个基本的例子,使用我能为初学者提出的最简单的方法。如果您在Java生态系统中保持一段时间的编码,那么一旦您有足够的经验可以绕过正确的用途,您就会发现更多适合您项目的高级工具。