2013-04-10 27 views
34

Tôi đang cố gắng lấy loại giá trị được lưu trữ trong một JSONObject.Cách kiểm tra loại giá trị từ JSONObject?

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

Có thể lấy loại giá trị được lưu trữ ở khóa "a"; giống như jObj.typeOf("a") = java.lang.Integer?

+1

Nếu bạn muốn kiểm soát nhiều hơn JSON phân tích, sử dụng một số phân tích cú pháp khác hơn 'org.json', chẳng hạn như Jackson. – laalto

Trả lời

57

Bạn có thể lấy đối tượng từ JSON bằng cách sử dụng phương thức get() và sau đó sử dụng toán tử instanceof để kiểm tra loại đối tượng. Một cái gì đó như thế này: -

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

Lưu ý rằng nó có thể là 'Integer' hoặc' Long'; 'Float' hoặc' Double'. – 18446744073709551615

+0

hehe, tôi có một số ví dụ huyền thoại cho trường hợp này: Tôi có hai JSONObject {"lượt truy cập": 4880502, ...}, nhưng khi tôi nhận được trường này bằng object.get ("lượt truy cập"), tôi có: object1 val: 4880502.0 | class java.lang.Double object2 val: 4880502 | class java.lang.Integer –

+0

Gson có chức năng tương tự không? Tài liệu của họ dường như không chỉ định bất cứ điều gì liên quan đến việc nhận loại của một trường cụ thể. –

9

Giải pháp tốt nhất là sử dụng JSONObject.get() và kiểm tra loại sử dụng toán tử instanceof.

+0

Bạn có thể sử dụng kiểu tiếp cận này cho từng loại bạn cần, bắt buộc ngoại lệ thích hợp –

+0

cách tiếp cận thứ nhất, ném ngoại lệ, tốn kém về mặt tài nguyên và cần tránh, đặc biệt nếu được sử dụng trên các thiết bị quan trọng. (di động/tab) – Ankit

+0

@ ay89 thanx! sửa nó. – BobTheBuilder

0

Bạn có thể phân tích tất cả dữ liệu thành String và sau đó thử chuyển đổi thành loại mong muốn. Tại thời điểm này, bạn có thể bắt ngoại lệ và xác định loại nào là dữ liệu được phân tích cú pháp.

2

Xin lưu ý rằng JSONObject.get() có thể trả về một số nguyên là một trong hai java.lang.Integer hoặc java.lang.Long, ví dụ, cho {a:3,b:100300000000} chúng ta thấy

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

tôi sử dụng mã tương tự (lưu ý rằng chúng sử dụng các loại longdouble thay vì intfloat và trong nhiệm vụ của tôi có thể có không có lồng nhau JSONObject hoặc JSONArray để chúng không được hỗ trợ):

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(); 
      } 
    } 

nơi AsIterable cho phép chúng ta sử dụng for(:) vòng lặp với một iterator và được định nghĩa là:

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

Tại sao String không được đúc thành chuỗi và bạn lại sử dụng phương thức getString? – htafoya

Các vấn đề liên quan