Метод приведения объекта к JSONObject или JSONArray в зависимости от объекта

Я пробовал такой метод, но я не могу найти никакого решения:

public static JSONObject or JSONArray objectToJSON(Object object){
    if(object is a JSONObject)
        return new JSONObject(object)
    if(object is a JSONArray)
        return new JSONArray(object)
}

Я пробовал это:

public static JSONObject objectToJSONObject(Object object){
    Object json = null;
    try {
        json = new JSONTokener(object.toString()).nextValue();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    JSONObject jsonObject = (JSONObject)json;
    return jsonObject;
}

public static JSONArray objectToJSONArray(Object object){
    Object json = null;
    try {
        json = new JSONTokener(object.toString()).nextValue();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    JSONArray jsonObject = (JSONArray)json;
    return jsonObject;
}

Но затем, когда я вызываю objectToJSONArray(object), я помещаю JSONObject, он завершает кастинг. Поэтому я хочу универсальный метод. Кто-нибудь найдет какое-нибудь решение?


person Damia Fuentes    schedule 10.10.2015    source источник


Ответы (2)


Я предполагаю, что вы видели этот вопрос. Вероятно, вы можете просто добавить проверку типа с помощью instanceof перед возвратом из каждого метода и вернуть null, если объект не имеет ожидаемого типа. Это должно избавиться от ClassCastException.

Пример:

public static JSONObject objectToJSONObject(Object object){
    Object json = null;
    JSONObject jsonObject = null;
    try {
        json = new JSONTokener(object.toString()).nextValue();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    if (json instanceof JSONObject) {
        jsonObject = (JSONObject) json;
    }
    return jsonObject;
}

public static JSONArray objectToJSONArray(Object object){
    Object json = null;
    JSONArray jsonArray = null;
    try {
        json = new JSONTokener(object.toString()).nextValue();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    if (json instanceof JSONArray) {
        jsonArray = (JSONArray) json;
    }
    return jsonArray;
}

Затем вы можете попробовать оба метода и использовать возвращаемое значение того, который не возвращает null, например:

public void processJSON(Object obj){
    JSONObject jsonObj = null;
    JSONArray jsonArr = null;
    jsonObj = objectToJSONObject(obj);
    jsonArr = objectToJSONArray(obj);
    if (jsonObj != null) {
        //process JSONObject
    } else if (jsonArr != null) {
        //process JSONArray
    }
}
person Daniel Nugent    schedule 10.10.2015

JsonArray по своей сути является списком

JsonObject по своей сути является картой

Поскольку Java не поддерживает функции с несколькими типами возвращаемого значения (если только это не универсальная функция с типом возвращаемого значения, принятым в качестве аргумента - пример ), самый простой способ выполнить то, что вам нужно, заключается в следующем:

if (object instanceof Map){
    JSONObject jsonObject = new JSONObject();
    jsonObject.putAll((Map)object);
    ...
    ...
}
else if (object instanceof List){
    JSONArray jsonArray = new JSONArray();
    jsonArray.addAll((List)object);
    ...
    ...
}

Альтернативой этому, если вам нужна функция, является преобразование данного JsonObject в JsonArray и написание кода для работы с этим JsonArray, не беспокоясь о типе. Этой цели служит следующая функция.

public JSONArray getJsonObjectOrJsonArray(Object object){
    JSONArray jsonArray = new JSONArray();
    if (object instanceof Map){
        JSONObject jsonObject = new JSONObject();
        jsonObject.putAll((Map)object);
        jsonArray.add(jsonObject);
    }
    else if (object instanceof List){
        jsonArray.addAll((List)object);
    }
    return jsonArray;
}
person Pankaj Singhal    schedule 10.10.2015