java - 具有不同结构的 JSON 文件处理

标签 java android json

我有一个 Android 应用程序 (Java),可以处理来自网络的 API。

当前应用程序正在处理如下所示的 JSON 文件:

{
"contacts": [
    {
        "id": 1, 
        "name": "name1", 
        "email": "email1", 
        "phone": "1234567890"
    }, 
    {
        "id": 2, 
        ETC... 

我需要处理另一个 JSON 文件,但它具有不同的结构:

{
    "contacts": {
        "1": {
            "id": 1, 
            "name": "name1", 
            "email": "email1", 
            "phone": "1234567890", 
            "level1": {
                "level2": {
                    "level3": 3, 
                }
            }, 
            "last_updated": 20180712
        }, 
        "2": {
            ETC...

如何通过调整以下代码来处理第二个 JSON 文件?

    if (jsonSource != null) {
        try {
            JSONObject jsonObject = new JSONObject(jsonSource);
            JSONArray jsonArrayData = jsonObject.getJSONArray("contacts");

            for (int i = 0; i < jsonArrayData.length(); i++) {
                JSONObject contacts = jsonArrayData.getJSONObject(i);
                String id = contacts.getString("id");
                String name = contacts.getString("name");
                String email = contacts.getString("email");
                String phone = contacts.getString("phone");

                HashMap<String, String> values = new HashMap<>();
                values.put("id", id);
                values.put("name", name);
                values.put("email, email);
                values.put("phone, phone);
                contactList.add(values);
            }
        } catch (final JSONException e) {
            Log.e(TAG, "JSON parsing error: " + e.getMessage());
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getContext(), "ERROR", Toast.LENGTH_LONG).show();
                }
            });
        }
    } else {
        Log.e(TAG, "Unable to retrieve JSON file from URL");
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getContext(), "ERROR", Toast.LENGTH_LONG).show();
            }
        });
    }
    return null;

非常感谢任何帮助!

最佳答案

看起来,在第一个 json 中,您有“联系人”作为对象数组,而在第二个 json 中,您有“联系人”作为对象。里面有其他对象,简化版本如下所示:

"contacts": [
    {...},
    {...},
    {...}
]
"contacts": {
    "1": {...}, 
    "2": {...},
    "3": {...}
}

因此,您唯一的选择是手动检查“联系人”数组或对象,并基于它更改您的代码。 它看起来像这样:

JSONObject jsonObject = new JSONObject(jsonSource);
if (jsonObject.get("contacts") instanceof JSONObject) {
    JSONObject contactsJson = jsonObject.getJSONObject("contacts");
    for (Iterator<String> it = contactsJson.keys(); it.hasNext(); ) {
        String key = it.next();
        JSONObject contactJson = contactsJson.getJSONObject(key);
        // your code to process contact item
    }
} else {
    // Your code to process every contact item
}

关于java - 具有不同结构的 JSON 文件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51314117/

相关文章:

java - SQL 如何仅返回一些列,例如前 10 列,而不在 SQL 查询中指定它们

java - 如何使用 android 从 Nest API 检索 Json 对象

java - 如何为 optaplanner 运行/实现 Benchmark?

java - 使用 Java 在 Google Compute Engine 上进行批处理

android - 如何从 Android 设备打印到 Windows 网络共享打印机?

android - 使用Achartengine的水平条形图

python - 逐行读取文件,并获取以某个单词开头的行?

android - 找不到 Android 7.1.1 (Nougat) API 25 ARM 系统镜像

Java : Json with duplicate keys to map using Jackson

java - 如何在android中检索json数组?