java – 从JSON或XML feed导入数据并在Android中创建List

我正在尝试创建一个
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一般都不是很有经验(我只是在路上学习)所以我不知道如何继续.

从谷歌开发者网站我发现了一个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;
    }
}

从服务器源接收的数据应类似于:

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

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

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

一种从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;
}

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

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应用程序消耗列表(json数组的“app”json对象)通过RESTful服务,使用从Android应用程序的这个答案写的代码(是的,你可以导入这个作为一个功能齐全的Android工作室项目):https://github.com/elcodedocle/android-resttest

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

点赞