2016-10-09 4 views
0

Я создаю утилиту обновления, которая обновляет мое приложение. Мне нужно сохранить мои файлы конфигурации из предыдущей версии. Некоторые файлы конфигураций являются файлами JSON. Есть ли способ обновить файлы JSON таким образом, что я сохраняю старые значения , но если есть новые объекты или ключи, они также будут сохранены?Java - Объединить файлы JSON

Например: Version 1 JSON файла:

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

Version 2 JSON файл:

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

Ожидаемый файл JSON после слияния:

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

Есть ли способ сделать это без какой-либо внешней библиотеки?

+0

вы используете любую библиотеку JSON или вы пишете JSON вручную? – nandsito

+0

В настоящее время я не использую библиотеку JSON, данные JSON, предоставленные мне в качестве файлов, я не знаю, как они были написаны первоначально. – Zoltanik

+1

Используйте библиотеку. Поместите оба в хашмап. Перестроить объект JSON –

ответ

2

Как @ cricket_007 советовал, это решение работает для меня:

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; 
} 
Смежные вопросы