我正在尝试获取存储在JSONObject
中的值的类型。
String jString = {"a": 1, "b": "str"};
JSONObject jObj = new JSONObject(jString);
是否可以获取存储在密钥"a"
中的值的类型;
类似于jObj.typeOf("a") = java.lang.Integer
?
答案 0 :(得分:68)
您可以使用get()
方法从JSON获取对象,然后使用instanceof
运算符检查对象的类型。这样的事情: -
String jString = "{\"a\": 1, \"b\": \"str\"}";
JSONObject jObj = new JSONObject(jString);
Object aObj = jObj.get("a");
if(aObj instanceof Integer){
System.out.println(aObj);
}
答案 1 :(得分:9)
最佳解决方案是使用JSONObject.get()
并使用instanceof
运算符检查类型。
答案 2 :(得分:2)
请注意,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;
}
}
答案 3 :(得分:0)
您可以将所有数据解析为String
,然后尝试将其转换为所需类型。此时,您可以捕获异常并确定解析数据的类型。
答案 4 :(得分:0)
我发现这种方法可以在JSON / Json中查找元素值的数据类型。对我来说很好。
<script>
function sendMail() {
let doc = new jsPDF('p','pt','a4');
doc.setProperties({
title: 'PDF Document',
subject: 'subject',
author: 'ABC',
keywords: 'generated, javascript, web 2.0, ajax',
creator: 'XYZ'
});
//document.getElementById('reportbuttons').remove();
document.getElementById('reportbuttons').style.display ="none";
doc.addHTML(document.body, function() {
var data = doc.output('datauristring');
var reqJson = {};
reqJson.machineId = "<%=machineId%>";
reqJson.monthYear = "<%=monthYear%>";
reqJson.data = data;
$.ajax(
{
url : "sendMail/",
type: "POST",
dataType: 'json',
data : JSON.stringify(reqJson),
contentType: "application/json",
success:function(data)
{
$("#myModal").modal();
alert('mail sent successfully');
document.getElementById('reportbuttons').style.display ="block";
},
error: function(data)
{
document.getElementById('reportbuttons').style.display ="block";
}
});
});
}
</script>
答案 5 :(得分:0)
instanceof
对我不起作用。在最新版本中,动态获取字段的数据类型,而不是使用JSONObject.get
,您可以像使用JsonPrimitive
一样获取它
JsonPrimitive value = json.getAsJsonPrimitive('key');
现在您可以打电话
value.isNumber()
value.isBoolean()
value.isString()