我试图获取存储在JSONObject
中的值的类型。如何检查JSONObject的值的类型?
String jString = {"a": 1, "b": "str"};
JSONObject jObj = new JSONObject(jString);
是否有可能获得存储在键值"a"
的值的类型; 类似jObj.typeOf("a") = java.lang.Integer
?
我试图获取存储在JSONObject
中的值的类型。如何检查JSONObject的值的类型?
String jString = {"a": 1, "b": "str"};
JSONObject jObj = new JSONObject(jString);
是否有可能获得存储在键值"a"
的值的类型; 类似jObj.typeOf("a") = java.lang.Integer
?
您可以使用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);
}
请注意它可能是'Integer'或'Long'; “浮动”或“双”。 – 18446744073709551615 2015-03-16 08:19:46
嘿,我有这种情况下的一些神话的例子: 我有两个相同的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
gson是否有类似的功能?他们的文档似乎没有指定任何关于获取特定字段的类型。 – 2017-01-13 17:48:01
最好的解决方案是使用JSONObject.get()
并使用instanceof
运算符检查类型。
您可以针对您需要的每种类型使用这种方法,捕获适当的异常 – 2013-04-10 08:07:09
第一种方法抛出异常,在资源方面成本高昂,应该避免这种情况,尤其是在资源关键型设备上使用时。 (手机/标签) – Ankit 2013-04-10 08:12:03
@ ay89 thanx!修复。 – BobTheBuilder 2013-04-10 08:15:16
您可以分析所有的数据String
,然后尝试将其转换为所需的类型。此时,您可能会捕获异常并确定哪种类型是解析的数据。
请注意:JSONObject.get()
可能会返回一个整数要么java.lang.Integer
或java.lang.Long
,例如,用于{a:3,b:100300000000}
我们看到
D/+++ (5526): +++a=>class java.lang.Integer:3
D/+++ (5526): +++b=>class java.lang.Long:100300000000
我用类似的代码(注意,我们使用类型long
和double
代替int
和float
,在我的任务中可能有没有嵌套JSONObject
或JSONArray
所以他们不支持):
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;
}
}
为什么字符串不会被转换为字符串,并且您再次使用getString方法? – htafoya 2016-01-05 23:43:15
如果您想对JSON解析更多的控制,使用一些其他的解析器比'org.json',如杰克逊。 – laalto 2013-04-10 08:15:41