【问题标题】:Method to cast Object to JSONObject or JSONArray depending on the Object根据 Object 将 Object 转换为 JSONObject 或 JSONArray 的方法
【发布时间】:2015-10-10 15:53:26
【问题描述】:

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

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,它会导致强制转换。所以我想要一个通用的方法。有人找到解决办法吗?

【问题讨论】:

    标签: java android json casting jsonobject


    【解决方案1】:

    我假设您已经看过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
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-26
        • 1970-01-01
        • 2021-03-09
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-05
        相关资源
        最近更新 更多