2013-04-10 414 views
34

我试图获取存储在JSONObject中的值的类型。如何检查JSONObject的值的类型?

String jString = {"a": 1, "b": "str"}; 
JSONObject jObj = new JSONObject(jString); 

是否有可能获得存储在键值"a"的值的类型; 类似jObj.typeOf("a") = java.lang.Integer

+1

如果您想对JSON解析更多的控制,使用一些其他的解析器比'org.json',如杰克逊。 – laalto 2013-04-10 08:15:41

回答

57

您可以使用get()方法从JSON中获取对象,然后使用instanceof运算符来检查Object的类型。事情是这样的: -

String jString = "{\"a\": 1, \"b\": \"str\"}"; 
JSONObject jObj = new JSONObject(jString); 
Object aObj = jObj.get("a"); 
if(aObj instanceof Integer){ 
    System.out.println(aObj); 
} 
+0

请注意它可能是'Integer'或'Long'; “浮动”或“双”。 – 18446744073709551615 2015-03-16 08:19:46

+0

嘿,我有这种情况下的一些神话的例子: 我有两个相同的JSONObject {“访问”:4880502,...},但是当我通过object.get(“访问”)得到这个字段时,我有: object1 val:4880502.0 | class java.lang.Double object2 val:4880502 | class java.lang.Integer – 2016-11-09 17:08:18

+0

gson是否有类似的功能?他们的文档似乎没有指定任何关于获取特定字段的类型。 – 2017-01-13 17:48:01

9

最好的解决方案是使用JSONObject.get()并使用instanceof运算符检查类型。

+0

您可以针对您需要的每种类型使用这种方法,捕获适当的异常 – 2013-04-10 08:07:09

+0

第一种方法抛出异常,在资源方面成本高昂,应该避免这种情况,尤其是在资源关键型设备上使用时。 (手机/标签) – Ankit 2013-04-10 08:12:03

+0

@ ay89 thanx!修复。 – BobTheBuilder 2013-04-10 08:15:16

0

您可以分析所有的数据String,然后尝试将其转换为所需的类型。此时,您可能会捕获异常并确定哪种类型是解析的数据。

2

请注意:JSONObject.get()可能会返回一个整数要么java.lang.Integerjava.lang.Long,例如,用于{a:3,b:100300000000}我们看到

D/+++  (5526): +++a=>class java.lang.Integer:3 
D/+++  (5526): +++b=>class java.lang.Long:100300000000 

我用类似的代码(注意,我们使用类型longdouble代替intfloat,在我的任务中可能有没有嵌套JSONObjectJSONArray所以他们不支持):

for (String k : new AsIterable<String>(json.keys())) { 
      try { 
        Object v = json.get(k); 
     //Log.d("+++","+++"+k+"=>"+v.getClass()+":"+v); 
        if (v instanceof Integer || v instanceof Long) { 
          long intToUse = ((Number)v).longValue(); 
          ... 
        } else if (v instanceof Boolean) { 
          boolean boolToUse = (Boolean)v).booleanValue(); 
          ... 
        } else if (v instanceof Float || v instanceof Double) { 
          double floatToUse = ((Number)v).doubleValue(); 
          ... 
        } else if (JSONObject.NULL.equals(v)) { 
          Object nullToUse = null; 
          ... 
        } else { 
          String stringToUse = json.getString(k); 
          ... 
        } 
      } catch (JSONException e2) { 
        // TODO Auto-generated catch block 
        Log.d("exc: "+e2); 
        e2.printStackTrace(); 
      } 
    } 

其中AsIterable让我们使用for(:)循环与迭代器,并定义为:

public class AsIterable<T> implements Iterable<T> { 
    private Iterator<T> iterator; 
    public AsIterable(Iterator<T> iterator) { 
     this.iterator = iterator; 
    } 
    public Iterator<T> iterator() { 
     return iterator; 
    } 
} 
+0

为什么字符串不会被转换为字符串,并且您再次使用getString方法? – htafoya 2016-01-05 23:43:15