【问题标题】:How to update a nested JSON object in JSON file using Java?如何使用 Java 更新 JSON 文件中的嵌套 JSON 对象?
【发布时间】:2018-03-01 23:19:23
【问题描述】:

我有一个 JSON 文件,其中包含一组用户对象。每个用户对象都包含一个包含对象的目标数组,并且在每个目标对象中是一个里程碑数组,其中包含 1 到多个里程碑对象。

我能够利用 JSON-Simple 轻松解析它们并以 Java 对象的形式存储信息,但我发现在 JSON 文件中重写某些块或附加到其中一个块中具有挑战性数组。我在网上找到的例子太简单了,并没有考虑到这么多的嵌套。

如果我想重写 JSON 文件中的 Goal 对象或里程碑数组中的特定 Milestone,我将如何根据相应 Java 对象模型中分配的属性来更新文件?是否可以在其中一个数组中的 JSON 文本文件中修改/附加特定块?

[
{       
    "username": "example",
    "password": "pwd",  
    "Goals":[
        {   
            "goalId": "G0001",
            "goalName": "COEN 275 Midterm",
            "startDate": "02/14/2017",
            "endDate": "02/28/2017",
            "numMilestones": 5,
            "color": "#4286f4",
            "hoursPerDay": 4,
            "milestones":[
                {   
                    "milestoneName": "Chapter 1",
                    "Difficulty": "E",
                    "dueDate": "02/18/2018",
                    "completed": true
                },
                {   "milestoneName": "Chapter 2",
                    "Difficulty": "E",
                    "dueDate": "02/22/2018",
                    "completed": true
                },
                {   "milestoneName": "Chapter 3",
                    "Difficulty": "M",
                    "dueDate": "02/23/2018",
                    "completed": true
                },
                {   "milestoneName": "Chapter 4",
                    "Difficulty": "M",
                    "dueDate": "02/25/2018",
                    "completed": false
                },
                {   "milestoneName": "Chapter 5",   
                    "Difficulty": "H",
                    "dueDate": "02/28/2018",
                    "completed": false
                }
            ]
        }
    ]
},
{       
    "username": "username",
    "password": "pwd",  
    "Goals":[
        {   
            "goalId": "G0001",
            "goalName": "COEN 279 Midterm",
            "startDate": "02/14/2017",
            "endDate": "02/28/2017",
            "numMilestones": 5,
            "color": "#4286f4",
            "hoursPerDay": 4,
            "milestones":[
                {   
                    "milestoneName": "Chapter 5",
                    "Difficulty": "E",
                    "dueDate": "02/18/2018",
                    "completed": true
                },
                {   "milestoneName": "Chapter 6",
                    "Difficulty": "E",
                    "dueDate": "02/22/2018",
                    "completed": true
                },
                {   "milestoneName": "Chapter 7",
                    "Difficulty": "M",
                    "dueDate": "02/23/2018",
                    "completed": true
                },
                {   "milestoneName": "Chapter 11",
                    "Difficulty": "M",
                    "dueDate": "02/25/2018",
                    "completed": false
                },
                {   "milestoneName": "Chapter 12",  
                    "Difficulty": "H",
                    "dueDate": "02/28/2018",
                    "completed": false
                }
            ]
        }
    ]
}
]

【问题讨论】:

    标签: java arrays json arraylist io


    【解决方案1】:

    简单 JSON 中的数组是 JSONArray 类型的类(这只是一个 java util ArrayList),所以一旦你得到数组和对象(这是一个 java util HashMap)你就可以修改它。

    JSONArray users = (JSONArray) JSONValue.parse(json);
    JSONObject firstUser = (JSONObject) users.get(0);
    
    JSONArray firstUserGoals = (JSONArray) firstUser.get("Goals");
    JSONObject firstUserFirstGoal = (JSONObject) firstUserGoals.get(0);
    
    JSONArray firstUserFirstGoalMilestones = (JSONArray) firstUserFirstGoal.get("milestones");
    JSONObject firstUserFirstGoalFirstMilestone = (JSONObject) firstUserFirstGoalMilestones.get(0);
    

    这样您就可以编辑里程碑

    firstUserFirstGoalFirstMilestone.put("milestoneName", "Chapter 0");
    

    您可以创建一个新的里程碑

    JSONObject milestone1 = new JSONObject();
    milestone1.put("milestoneName", "Chapter 1");
    milestone1.put("Difficulty", "H");
    milestone1.put("dueDate", "02/18/2018");
    milestone1.put("completed", true);
    

    然后将其添加到里程碑列表中,在位置 1。如果没有指定索引,则最后添加。

    firstUserFirstGoalMilestones.add(1, milestone1);
    

    最后你可以得到 JSON 作为字符串。

    String finalJson = users.toJSONString();
    

    或写入文件(应处理异常)

    Writer writer = new FileWriter(path);
    users.writeJSONString(writer);
    writer.close();
    

    【讨论】:

    • 兄弟,我不担心修改 JSONObject 本身,而是将这些更新反映在 JSON 文本文件中
    • JSON 是如何存储在您的文件系统中的?
    • 如果它是您文件系统中的文本文件,您只需再次写入该文件即可。我刚刚更新了答案。
    • 嗨,这很好用。在旁注中,我将如何修改特定属性而不是附加到 JSON 数组?如果您能够为此提供解决方案,那将回答我所有的问题,我可以将其标记为已接受的答案。 JSON 文件也只是存储在不同的包中。
    • 是的,没错,如果键不存在,则使用指定的值创建它,如果键已经存在,则更新值。您也可以使用remove(String name) 方法删除键
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2021-01-10
    • 2021-08-29
    相关资源
    最近更新 更多