我使用jackson裝載JSON和yaml配置文件,有是每個環境的基本配置文件和一個配置文件。 我加載基本配置和環境特定配置。 然後我深度合併這兩個地圖。列表也被合併,刪除重複。 在map1上深度合併值,在發生衝突時map2中的值覆蓋來自map1的值。
void deepMerge(Map<String, Object> map1, Map<String, Object> map2) {
for(String key : map2.keySet()) {
Object value2 = map2.get(key);
if (map1.containsKey(key)) {
Object value1 = map1.get(key);
if (value1 instanceof Map && value2 instanceof Map)
deepMerge((Map<String, Object>) value1, (Map<String, Object>) value2);
else if (value1 instanceof List && value2 instanceof List)
map1.put(key, merge((List) value1, (List) value2));
else map1.put(key, value2);
} else map1.put(key, value2);
}
}
List merge(List list1, List list2) {
list2.removeAll(list1);
list1.addAll(list2);
return list1;
}
例如: 基本配置:
electronics:
computers:
laptops:
apple:
macbook: 1000
macbookpro: 2000
windows:
surface: 2000
desktop:
apple:
imac: 1000
windows:
surface: 2000
phones:
android:
samsung:
motox: 300
apple:
iphone7: 500
books:
technical:
- java
- perl
novels:
- guerra y paz
- crimen y castigo
poetry:
- neruda
- parra
測試ENV配置:
electronics:
computers:
laptops:
windows:
surface: 2500
desktop: 100
phones:
windows:
nokia: 800
books:
technical:
- f sharp
novels: [2666]
poetry:
- parra
合併配置:
electronics:
computers:
laptops:
apple:
macbook: 1000
macbookpro: 2000
windows:
surface: 2500
desktop: 100
phones:
android:
samsung:
motox: 300
apple:
iphone7: 500
windows:
nokia: 800
books:
technical:
- "java"
- "perl"
- "f sharp"
novels:
- "guerra y paz"
- "crimen y castigo"
- 2666
poetry:
- "neruda"
- "parra"
發生什麼情況,如果有衝突?你想如何處理?順便問一下好問題。 – 2014-09-10 20:22:50
對於我自己,它是從左到右的地圖合併,右圖(新地圖)覆蓋舊地圖,如果密鑰存在.... – adrian 2014-09-10 20:25:06