web-dev-qa-db-fra.com

Comment cloner un org.json.JSONObject en Java?

Existe-t-il un moyen de cloner une instance de org.json.JSONObject sans la chaîner et la ré-analyser le résultat?

Une copie superficielle serait acceptable.

30
Daniel Schaffer

Utilisez le constructeur public JSONObject(JSONObject jo, Java.lang.String[] names) et la méthode public static Java.lang.String[] getNames(JSONObject jo) .

JSONObject copy = new JSONObject(original, JSONObject.getNames(original));
49
Bill the Lizard

Le moyen le plus simple (et incroyablement lent et inefficace) de le faire

JSONObject clone = new JSONObject(original.toString());
57
Jaytjuh

Impossible de trouver une méthode de clonage profond existante pour com.google.gwt.json.client.JSONObject, mais l'implémentation doit comporter quelques lignes de code, comme par exemple:

public static JSONValue deepClone(JSONValue jsonValue){
    JSONString string = jsonValue.isString();
    if (string != null){return new JSONString(string.stringValue());}

    JSONBoolean aBoolean = jsonValue.isBoolean();
    if (aBoolean != null){return JSONBoolean.getInstance(aBoolean.booleanValue());}

    JSONNull aNull = jsonValue.isNull();
    if (aNull != null){return JSONNull.getInstance();}

    JSONNumber number = jsonValue.isNumber();
    if (number!=null){return new JSONNumber(number.doubleValue());}

    JSONObject jsonObject = jsonValue.isObject();
    if (jsonObject!=null){
        JSONObject clonedObject = new JSONObject();
        for (String key : jsonObject.keySet()){
            clonedObject.put(key, deepClone(jsonObject.get(key)));
        }
        return clonedObject;
    }

    JSONArray array = jsonValue.isArray();
    if (array != null){
        JSONArray clonedArray = new JSONArray();
        for (int i=0 ; i < array.size() ; ++i){
            clonedArray.set(i, deepClone(array.get(i)));
        }
        return clonedArray;
    }

    throw new IllegalStateException();
}

* Note: * Je ne l'ai pas encore testé!

3
Uri

Parce que $JSONObject.getNames(original) n'est pas accessible sous Android, Vous pouvez le faire avec:

public JSONObject shallowCopy(JSONObject original) {
    JSONObject copy = new JSONObject();

    for ( Iterator<String> iterator = original.keys(); iterator.hasNext(); ) {
        String      key     = iterator.next();
        JSONObject  value   = original.optJSONObject(key);

        try {
            copy.put(key, value);
        } catch ( JSONException e ) {
            //TODO process exception
        }
    }

    return copy;
}

Mais rappelez-vous que ce n'est pas une copie profonde.

0
Bogdan Stadnyk