Zoltanik
Zoltanik

Reputation: 189

Java - Merge JSON files

I am building an updater util that update my application. I need to save my configuration files from the previous version. Some of the configurations files are JSON files. Is there a way to update the JSON files in a way that i'm keeping the old values but if there new objects or keys they will be saved also?

For example: Version 1 json file:

{
    "name": "demo",
    "description": "Parse some JSON data",
    "location": "New York"
}

Version 2 json file:

{
    "name": "demo",
    "description": "Parse some JSON data",
    "location": "London",
    "day": "Monday"
}

Expected json file after the merge:

{
    "name": "demo",
    "description": "Parse some JSON data",
    "location": "New York",
    "day": "Monday"
}

Is there a way to do so without any external library?

Upvotes: 0

Views: 4448

Answers (1)

Zoltanik
Zoltanik

Reputation: 189

As @cricket_007 advised, This solution worked for me:

public void mergeJsonsFiles(File newJson, File oldJson) throws Exception {
    HashMap<String, Object> newMap = convertJsonToMap(newJson);
    HashMap<String, Object> oldMap = convertJsonToMap(oldJson);

    for (Entry<String, Object> entry : oldMap.entrySet()) {
        if (newMap.get(entry.getKey()) == null) {
            newMap.put(entry.getKey(), entry.getValue());
        }
    }

    ObjectMapper mapper = new ObjectMapper();
    String jsonFromMap = mapper.writeValueAsString(newMap);

    PrintWriter writer = new PrintWriter(newJson);
    writer.write(jsonFromMap);
    writer.close();
}

private HashMap<String, Object> convertJsonToMap(File json) {
    ObjectMapper mapper = new ObjectMapper();
    HashMap<String, Object> map = new HashMap<String, Object>();
    try {
        map = mapper.readValue(json, new TypeReference<HashMap<String, Object>>(){});
    } catch (IOException e) {
        map.clear();
    }
    return map;
}

Upvotes: 3

Related Questions