如何检查JSONObject中的值的类型?

时间:2013-04-10 08:02:44

标签: java json

我正在尝试获取存储在JSONObject中的值的类型。

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

是否可以获取存储在密钥"a"中的值的类型;  类似于jObj.typeOf("a") = java.lang.Integer

6 个答案:

答案 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.Integerjava.lang.Long的整数,例如,我们看到的{a:3,b:100300000000}

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

我使用的代码(注意我们使用的是long类型和double而不是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;
    }
}

答案 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()