Допущения
Предполагается, что ваши начальные объекты имеют тип Item
, как описано ниже.
class Item {
String fieldA,fieldB,fieldC;
// Getters / Setter
}
Предполагается, что ваш начальный список Item
называется items
Предполагается, что ваша начальная карта называется map
и имеет тип Map<String, Map<String,String>>
Решение
Добавьте метод к вашему классу Item, чтобы получить Map<String, String>
представление объекта
public Map<String, String> toMap() {
return new HashMap<String, String>() {{
put("fieldA", fieldA);
put("fieldB", fieldB);
put("fieldC", fieldC);
}};
}
Создайте метод для получения fieldD
значение для данного fieldA
значения
private String getFieldDValueForFieldAValue(String fieldAValue) {
return map.get(fieldAValue).get("fieldD");
}
Создайте метод для добавления правильного значения fieldD
к карте элементов
private Map<String, String> addFieldD(Map<String, String> itemMap) {
itemMap.put("fieldD", getFieldDValueForFieldAValue(itemMap.get("fieldA")));
return itemMap;
}
Затем вы можете сгенерировать список карт длякаждый объект имеет правильное значение fieldD
List<Map<String, String>> list = items.stream()
.map(Item::toMap) // Converts all Items to Maps
.map(m -> addFieldD(m)) // Adds the correct fieldD value to each Map
.collect(Collectors.toList()); // make it a List
и, наконец, создает из него строку JSON:
Type listType = new TypeToken<List<Map<String, String>>>() {}.getType();
Gson gson = new Gson();
String json = gson.toJson(list, listType);
System.out.println(json);
В результате получается следующий JSON:
[
{"fieldA":"lookupval1","fieldC":"val3","fieldB":"val2","fieldD":"xxx"},
{"fieldA":"lookupval1","fieldC":"val6","fieldB":"val5","fieldD":"xxx"},
{"fieldA":"lookupval2","fieldC":"val9","fieldB":"val8","fieldD":"yyy"}
]