代码之家  ›  专栏  ›  技术社区  ›  btrballin

如何使用Java更新JSON文件中的嵌套JSON对象?

  •  2
  • btrballin  · 技术社区  · 6 年前

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

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

    如果我想重写JSON文件中的一个目标对象或里程碑数组中的一个特定里程碑,我将如何根据相应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
                    }
                ]
            }
        ]
    }
    ]
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   Jose Da Silva Gomes Tarsbir Singh    6 年前

    JSON simple中的数组是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();