2017-02-22 2 views
3

У меня есть структура данных, как это:Android: Как добавить существующую JSONObject в существующий ключ

source: { 
    property_1: String, 
    property_2: String, 
    property_3: { 
     property_31: String 
    } 
} 

Я хочу иметь такую ​​функцию:

private JSONObject mergeProperty(JSONObject source, String propertyName, JSONObject newData) 

, в котором, source на данные выше, propertyName = "property_3" и

newData: { 
    property_32: String, 
    property_33: int 
} 

с результатом вызова mergeProperty(source, "property_3", newData) как:

output: { 
    property_1: String, 
    property_2: String, 
    property_3: { 
     property_31: String, 
     property_32: String, 
     property_33: int 
    } 
} 

Есть ли какой-либо простой способ достичь этого без необходимости сначала сопоставить объект JSON с HashMap? Я не нашел встроенной функции JSONObject, которая соответствует моей проблеме.

ответ

2

Если у вас есть намерение правильно, этот код должен выполнять эту работу. Пожалуйста, обратите внимание, что это будет мутировать исходный исходный код, поэтому вам может потребоваться передать копию, если мутация оригинала не является тем, что вы хотите. Кроме того, здесь я предполагаю, что propertyName находится на первом уровне вашего исходного JSON и тоже JSON, иначе это вызовет исключение JSON.

JSONObject mergeTarget = source.getJSONObject(propertyName); 
Iterator<String> keys = newData.keys(); 

while (keys.hasNext()) { 
    String key = keys.next(); 
    mergeTarget.put(key, newData.get(key)); 
} 
+0

Я не знал, что у JSON есть keySet. Да, это должно сделать трюк. – EdgarDrake

0

Попробуйте accumulate метод org.json.JSONObject.

Ниже код может быть вам полезен.

public class Test { 

    public static void main(String[] args){ 
     System.out.println("test"); 
     JSONObject source = new JSONObject("{\"property_1\":\"String\",\"property_2\":\"String\",\"property_3\":{\"property_31\":\"String\"}}"); 
     JSONObject newData = new JSONObject("{\"property_32\":\"String\",\"property_33\":\"int\"}"); 
     System.out.println("Before merge :"+source.toString()); 
     mergeProperty(source, "property_3", newData); 
     System.out.println("After merge :"+source.toString()); 
    } 

    private static void mergeProperty(JSONObject source, String property, JSONObject newData){ 
     for (Object key : newData.keySet()){ 
      String keyStr = (String)key; 
      Object keyvalue = newData.get(keyStr); 
      source.getJSONObject(property).accumulate(keyStr , keyvalue); 
     } 
    } 
} 
Смежные вопросы