#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.