GSON — обновление файлов json

#java #json #gson

#java #json #gson

Вопрос:

Я хочу иметь возможность создать новый файл json из двух существующих.

Первый список файлов json это:

 {
 "Jar_serviceid": "service_v1",
 "Jar_version": "1.0",
 "ServiceId": "srv_v1",
 "ServiceState": "Enable",
 "ServiceVersion": "v1",
 "LicenseRequired": false,
 "ServiceURL": null
 }
  

И второй — это:

 {
"Include":[
  {
     "Jar_serviceid":"service_v1",
     "Jar_version":"1.0",
     "ServiceState":"null"
  }
],
"Exclude":"rtm_v2"
}
  

После считывания этих обоих файлов я хочу, чтобы второй обновлял первый. В этом случае я хочу иметь что-то подобное в конце:

 {
 "Jar_serviceid": "service_v1",
 "Jar_version": "1.0",
 "ServiceId": "srv_v1",
 "ServiceState": "null",
 "ServiceVersion": "v1",
 "LicenseRequired": false,
 "ServiceURL": null
 }
  

Итак, каждая запись из второго файла json, при редактировании первого. У вас есть точка входа для меня?

Я пробовал что-то вроде этого:

     if (secondconfig != null) {
        if (secondconfig .getInclude() != null) {
            for (ServiceList service : secondconfig.getInclude()) {

                for (int i = 0; i < firstconfig.length; i  ) {
                    ServiceList serv = gson.fromJson(firstconfig[i], ServiceList.class);       
                 if(serv.getServiceId().equalsIgnoreCase(service.getJar_serviceid())){
                        // update

                    }
                }
            }
        }
        if (updatedconfig.getExclude() != null) {
            System.out.println("Execlude: "   updatedconfig.getExclude());
        }
        if (updatedconfig.getVin() != null) {
            System.out.println("VIN: "   updatedconfig.getVin());
        }
    }
  

Может быть, есть какой-то лучший способ сделать это? Спасибо.

Ответ №1:

Нам нужно выполнить итерацию значений второго json и внести необходимые обновления в исходные данные, вот как я бы это сделал:

 public static void main(String[] args) {

    Gson gson = new Gson();
    Map<String, Object> data = gson.fromJson("{"Jar_serviceid": "service_v1","Jar_version": "1.0","ServiceId": "srv_v1","ServiceState": "Enable","ServiceVersion": "v1","LicenseRequired": false,"ServiceURL": null}", Map.class);
    Map<String, Object> newValues = gson.fromJson("{"Include":[{"Jar_serviceid":"service_v1","Jar_version":"1.0","ServiceState":"null"}],"Exclude":"rtm_v2"}", Map.class);

    if(null != newValues
            amp;amp; newValues.containsKey("Include") 
            amp;amp; newValues.get("Include") instanceof List){
        Map<String,Object> firstValue = ((List<Map>) newValues.get("Include")).get(0);
        if(null == data){
            data = new HashMap<>(firstValue);
        }else{
            for(String key : firstValue.keySet()){
                data.put(key, firstValue.get(key));
            }
        }
    }

    System.out.println(gson.toJson(data));
}
  

Возможно, нам потребуется добавить дополнительные проверки null / type в зависимости от характера / формата данных, которые мы получаем.

Комментарии:

1. Это работает для меня! Никогда не думал об использовании Maps, чтобы избежать циклов. Теперь узнал кое-что новое. Merci.