Android - 从资产中解析巨大(超大)JSON文件的最佳方法

时间:2017-02-06 18:04:53

标签: android json

我正在尝试从assets文件夹解析一些巨大的JSON文件。如何加载和添加到RecyclerView。想知道什么是解析这种大文件(大约6MB)的最好的approch,如果你可能知道可以帮助我处理这个的好API。

3 个答案:

答案 0 :(得分:1)

我建议您使用GSON lib。它具有非常好的性能。

只需在gradle文件中添加此行即可导入lib。

compile 'com.google.code.gson:gson:2.2.4'

如果您的JSON以“[”(用户数组)开头,您可以像这样使用GSON:

public Set<User> getUsers(final Activity activity) {

    Set<User> usersList = new HashSet<>();
    String json = readFromAsset(activity, "myfile_with_array.json");
    Type listType = new TypeToken<HashSet<User>>() {}.getType();
    // convert json into a list of Users
    try {
        usersList = new Gson().fromJson(json, listType);
    }
    catch (Exception e) {
        // we never know :)
        Log.e("error parsing", e.toString());
    }
    return usersList;
}

/**
 * Read file from asset directory
 * @param act current activity
 * @param fileName file to read
 * @return content of the file, string format
 */
private  String readFromAsset(final Activity act, final String fileName)
{
    String text = "";
    try {
        InputStream is = act.getAssets().open(fileName);

        int size = is.available();

        // Read the entire asset into a local byte buffer.
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        text = new String(buffer, "UTF-8");
    } catch (IOException e) {
        e.printStackTrace();
    }
    return text;
}

这将返回一组用户。

如果你的JSON以“{”开头,那么可以映射到一个对象(比如说用户对象),你就可以这样使用它:

public User getUser(final Activity activity) {

        User user = null;
        String json = readFromAsset(activity, "myfile_with_object.json");
        try {
        // convert json in an User object
            user = new Gson.fromJson(json, User.class)
        }
        catch (Exception e) {
            // we never know :)
            Log.e("error parsing", e.toString());
        }
        return user;
    }

希望这有帮助!

答案 1 :(得分:0)

尝试使用谷歌的GSON

  

Gson提供简单的toJson()和fromJson()方法将Java对象转换为JSON,反之亦然

它只需要代表你的对象的类(你甚至可以从json here在线生成),然后调用:

MyObject obj = new Gson.fromJson(jsonString,MyObject.class)

答案 2 :(得分:0)

除了通过读取所有内容并将其放入JSONObject之外,没有有效的方法来加载大型JSON,除非结构是静态的并且您可以创建一个解析器来逐行读取它。

尽管如此,6MB并不是那么大。

根据应用程序和内存需求,在RecyclerView中根据需要加载任意数量的数据项,然后根据需要添加更多数据项。此外,您可以加载JSON,然后在不再需要时将其清空。

JSON对象的字符串:

JsonObject json = new JsonObject(string);