加载JSON文件,遍历条目并用Java编辑它们

时间:2018-10-10 11:13:52

标签: java json file

我是JSON Universe的新手,并且想以有意义的方式在JSON文件中存储多个JSONObject。 JSONObjects以字符串的形式出现,该字符串以该函数的JSON语法格式设置,具有多个属性:

  • 唯一标识符,此处为java.util.UUID(通用唯一标识符)
  • 名称
  • 年龄
  • 注释(随机字符串)

例如:

{"name":"Peter","ID":"bc6fe168-e73f-48c9-b421-ad3c4c424392", "Age":"23","Comment":"I am a new User"}

我的想法是,我加载json文件并将条目存储在列表中。然后,我检查UUID是否已在其中。如果不是,那么我将在列表末尾创建一个新条目,如果已​​经准备好了,我将更新该条目的其他属性。

这是我到目前为止所拥有的:

public void updateFile(String user) {

    /* String to JSONObject */
    JSONObject newUser = new JSONObject(content);

    /* Load JSON File */
    String content = readFile("C:\\localProjects\\list.json");

    /* Add or update "newUser" */
    if(boolean isNew = containsID(getID(newUser),content))
        content.append(user);
    else 
        updateUser(newUser);

}

此方法适用于我的用例,但对我而言似乎效率不高,并且实际上不是OOP方法。这也不是很严格,例如,如果我在另一个条目中添加了一个用作UUID的名称的新用户,则会编辑错误的用户,而不是将其添加为新用户。

有没有可以轻松帮助我的功能,例如: 将现有的JSON加载为JSON-List,遍历Object中的JSON对象,编辑特定的变量?

1 个答案:

答案 0 :(得分:2)

使用Jackson之类的工具,您可以

  1. 创建适当的POJO User.java,甚至可以使用JsonNode
  2. 将每个用户读入您的java对象
  3. 使用标识符作为密钥将每个用户存储到HashMap
  4. 将列表写到例如standard out

示例

此示例将用户数组读取到JsonNode个对象。通过JsonPointer语法访问ID字段。

@Test
public void json3() throws JsonParseException, JsonMappingException, IOException {
    Map<String, JsonNode> store = new HashMap<>();
    ObjectMapper mapper = new ObjectMapper();
    JsonNode users = mapper.readValue(
                    "[{\"name\":\"Peter\",\"ID\":\"bc6fe168-e73f-48c9-b421-ad3c4c424392\", \"Age\":\"23\",\"Comment\":\"I am a new User\"},{\"name\":\"jschnasse\",\"ID\":\"bc6fe168-e73f-48c9-b421-ad3c4c424393\", \"Age\":\"well\",\"Comment\":\"I am a fun User\"}]",
                    JsonNode.class);
    users.forEach((user) -> {
        String id = user.at("/ID").asText();
        if (!store.containsKey(id)) {
            store.put(id, user);
        } else {
            /* Do something else */
        }
    });
    System.out.println(toString(store.values()));
}

public String toString(Object obj) {
    try (StringWriter w = new StringWriter();) {
        new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writeValue(w, obj);
        return w.toString();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

打印

[ {
  "name" : "jschnasse",
  "ID" : "bc6fe168-e73f-48c9-b421-ad3c4c424393",
  "Age" : "well",
  "Comment" : "I am a fun User"
}, {
  "name" : "Peter",
  "ID" : "bc6fe168-e73f-48c9-b421-ad3c4c424392",
  "Age" : "23",
  "Comment" : "I am a new User"
} ]