2017-06-12 34 views
0

我必須做這樣的事情:迭代上org.json.JSONObject的值不同的操作適用於一個JSONObjects或JSONArrays

JSONObject obj; 
Iterator keys = obj.keys(); 

while(keys.hasNext()){ 
    String key = keys.next(); 
    if(obj.get(key) instanceof JSONOBject){ 
     //do something 
    } 
    else if(obj.get(key) instanceof JSONArray){ 
     //do something else 
    } else { 
     //do something even different 
    } 

} 

我想的東西更好地重構這個沒有的instanceof和這麼多如果別的。也許使用流和可選項,但我還沒有找到一個好的方法來使用它們與JSONObjects呢。任何提示?

回答

2

您可以創建一個ActionMap類,將類映射到要應用的操作(示例代碼在底部以供參考)。然後,你可以簡單地填充操作:

ActionMap m = new ActionMap(); 
m.put(JSONOBject.class, o -> System.out.println("JSONObject: " + o)); 
m.put(JSONArray.class, o -> System.out.println("JSONArray: " + o)); 
//etc. 

和使用地圖在循環:

while(keys.hasNext()){ 
    String key = keys.next(); 
    Object o = obj.get(key); 
    if (m.containsMapping(o)) m.apply(o); 
    else //deal with missing class mapping 
} 

簡化實施ActionMap類:

static class ActionMap { 
    private final Map<Class<?>, Consumer<?>> actions = new HashMap<>(); 

    <T> void put(Class<T> clazz, Consumer<T> consumer) { 
    actions.put(clazz, consumer); 
    } 

    <T> boolean containsMapping(T obj) { 
    return actions.containsKey(obj.getClass()); 
    } 

    @SuppressWarnings("unchecked") 
    <T> void apply(T obj) { 
    Consumer<T> action = (Consumer<T>) actions.get(obj.getClass()); 
    //null check 
    action.accept(obj); 
    } 
}  
相關問題