我正在尝试获取存储在JSONObject
.
String jString = {"a": 1, "b": "str"};
JSONObject jObj = new JSONObject(jString);
是否可以获取存储在 key 的值的类型"a"
;像jObj.typeOf("a") = java.lang.Integer
什么?
您可以借助JSONObject.get()
方法从 JSON 中获取对象,然后使用instanceof
运算符检查对象的类型。
这些线上的东西: -
String jString = "{\"a\": 1, \"b\": \"str\"}";
JSONObject jObj = new JSONObject(jString);
Object aObj = jObj.get("a");
if (aObj instanceof Integer) {
// do what you want
}
最好的解决方案是JSONObject.get()
使用运算符并检查类型instanceof
。
请注意,它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
anddouble
而不是int
and 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();
}
}
whereAsIterable
让我们将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;
}
}
我发现这种方法可以在 JSON / Json 中查找元素值的数据类型。它对我来说工作得很好。
JSONObject json = new JSONObject(str);
Iterator<String> iterator = json.keys();
if (iterator != null) {
while (iterator.hasNext()) {
String key = iterator.next();
Object value = json.get(key);
String dataType = value.getClass().getSimpleName();
if (dataType.equalsIgnoreCase("Integer")) {
Log.i("Read Json", "Key :" + key + " | type :int | value:" + value);
} else if (dataType.equalsIgnoreCase("Long")) {
Log.i("Read Json", "Key :" + key + " | type :long | value:" + value);
} else if (dataType.equalsIgnoreCase("Float")) {
Log.i("Read Json", "Key :" + key + " | type :float | value:" + value);
} else if (dataType.equalsIgnoreCase("Double")) {
Log.i("Read Json", "Key :" + key + " | type :double | value:" + value);
} else if (dataType.equalsIgnoreCase("Boolean")) {
Log.i("Read Json", "Key :" + key + " | type :bool | value:" + value);
} else if (dataType.equalsIgnoreCase("String")) {
Log.i("Read Json", "Key :" + key + " | type :string | value:" + value);
}
}
}
instanceof
不适合我。在最新版本中动态获取字段的数据类型,而不是使用JSONObject.get
你可以做的就是JsonPrimitive
像这样获取它
JsonPrimitive value = json.getAsJsonPrimitive('key');
现在你可以打电话
value.isNumber()
value.isBoolean()
value.isString()
您可以将所有数据解析为String
,然后尝试将其转换为所需的类型。此时您可能会捕获异常并确定解析数据的类型。