有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从JSON或XML提要导入数据,并在Android中创建列表

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

public final class AppList {

public static List<App> list;

public static List<App> setupApp() {
    list.add(buildAppInfo(
            "Browsers",
            "chrome",
            "description",
            "Google Inc.",
            "com.安卓.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,然后将该数据放在列表中。就我所读的内容而言,我可以使用截击,但我在截击或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

我的整个方法显然不起作用。有人能帮我实现我所需要的吗?多谢各位


共 (1) 个答案

  1. # 1 楼答案

    最简单的设置需要:

    一种从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生态系统

    [更新]

    我已经用这个答案的代码做了一个quick demo,所以你可以修改它。您还可以将其用作样板文件,以使用SpringBoot构建所需的rest服务。(查看https://elcodedocle-jsontest.herokuapp.com/apps了解最新通过的travisCI服务构建的实时部署)

    [另一个更新]

    如果您仍然不知道,这里有一个完整的android应用程序使用列表(json数组中的“app”json对象)通过RESTful服务提供,使用android应用程序(是的,您可以将此作为一个全功能的android studio项目导入):https://github.com/elcodedocle/android-resttest

    请记住,这是一个基本的例子,使用了我能为初学者想出的最简单的方法。如果您在Java生态系统中继续编写代码一段时间,您将发现更高级的工具,这些工具可能更适合您的项目,只要您有足够的经验来理解它们的正确用法