根据Object将Object强制转换为JSONObject或JSONArray的方法

时间:2015-10-10 15:53:27

标签: java android json casting jsonobject

我一直在尝试这样的方法,但我找不到任何解决方案:

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(对象)时,我放了一个JSONObject它崩溃了。所以我想要一个通用的方法。有人找到任何解决方案吗?

2 个答案:

答案 0 :(得分:4)

我假设您已经看过this question。 您可以在从每个方法返回之前使用instanceof添加类型检查,如果Object不是预期的类型,则返回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
    }
}

答案 1 :(得分:0)

JsonArray本来就是List

JsonObject本来就是Map

由于Java不支持具有多种返回类型的函数(除非它是一个泛型函数,返回类型被接受为参数 - example),因此执行所需操作的最简单方法如下:

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;
}