2013-07-05 35 views
87

Vì vậy, tôi nhận được một số giá trị JSON từ máy chủ nhưng tôi không biết liệu sẽ có một trường cụ thể hay không.Làm cách nào để kiểm tra xem khóa json có tồn tại không?

Vì vậy, như:

{ "regatta_name":"ProbaRegatta", 
    "country":"Congo", 
    "status":"invited" 
} 

Và đôi khi, sẽ có trường bổ sung như:

{ "regatta_name":"ProbaRegatta", 
    "country":"Congo", 
    "status":"invited", 
    "club":"somevalue" 
} 

Tôi muốn kiểm tra xem trường có tên là "câu lạc bộ" tồn tại để phân tích cú pháp tôi sẽ không nhận được org.json.JSONException: Không có giá trị cho câu lạc bộ

+0

if (jsonObject.getString ("club")! = Null) {// get the vale here} –

+2

Không, tại ngoại lệ xử lý mã dừng và các hành động phân tích cú pháp tiếp theo sẽ không chạy. –

+1

@SoftwareSainath Thats không hoạt động, vẫn có ngoại lệ. –

Trả lời

169

lớp JSONObject có một phương thức có tên là "có":

http://developer.android.com/reference/org/json/JSONObject.html#has(java.lang.String)

trả về true nếu đối tượng này có một ánh xạ tên. Ánh xạ có thể là NULL.

+11

vì " chứa "quá nhiều?" – Omri374

+0

Điều gì sẽ xảy ra nếu khóa là từ loại 'Integer'? – Eido95

+1

@ Eido95 có một 'Integer' như là một âm thanh quan trọng như thực hành xấu. JSON phải có khóa String và giá trị của bất kỳ thứ gì bạn cần. – Nico

8

bạn có thể JSONObject#has, cung cấp key làm nhập và kiểm tra xem phương thức trả về true hoặc false. Bạn có thể cũng

sử dụng optString thay vì getString:

Trả về giá trị ánh xạ theo tên nếu nó tồn tại, ép buộc nó nếu cần thiết. Trả về chuỗi rỗng nếu không có bản đồ như vậy tồn tại

+1

Mặc dù phương pháp này có thể được sử dụng cho người khác, điều này không trả lại nếu giá trị tồn tại. 'getString' sẽ trả về một chuỗi rỗng,' optString' cũng sẽ trả về một chuỗi rỗng. Giả sử sau đó bạn sẽ tin rằng tài sản không có sẵn trong tình huống của OP. –

+0

@Blackbelt bạn có nguồn cho điều này không? – tsuz

5

ngay trước khi đọc chủ chốt kiểm tra xem nó như trước đây đọc

JSONObject json_obj=new JSONObject(yourjsonstr); 
if(json_obj.isNull("club")) 
{ 
    //it's contain value to be read operation 
} 
else 
{ 
    //it's not contain key club or isnull so do this operation here 
} 

định nghĩa hàm IsNull

Returns true if this object has no mapping for name or 
if it has a mapping whose value is NULL. 

tài liệu chính thức dưới đây liên kết cho isNull chức năng

http://developer.android.com/reference/org/json/JSONObject.html#isNull(java.lang.String)

98

Bạn có thể kiểm tra theo cách này 'HAS' - Trả về true nếu đối tượng này có ánh xạ cho tên. Ánh xạ có thể là NULL.

 if (json.has("status")) { 
     String status = json.getString("status")); 
    } 
    if (json.has("club")) { 
     String club = json.getString("club")); 
    } 

Bạn cũng có thể kiểm tra sử dụng 'IsNull' - Trả về true nếu đối tượng này không có bản đồ cho tên hoặc nếu nó có một bản đồ có giá trị là NULL.

if (!json.isNull("club")) 
    String club = json.getString("club")); 
+0

mà bạn đang sử dụng lib, bạn có thể cung cấp một ví dụ đơn giản cho json-smart hoặc json-simple –

2

Hãy thử điều này

if(!jsonObj.isNull("club")){ 
    jsonObj.getString("club"); 
} 
+0

'isNull' thực sự là để kiểm tra nếu ánh xạ là null, không để kiểm tra tính khả dụng của một thành viên json. –

6

Bạn có thể sử dụng has

public boolean has(String key) 

Xác định nếu JSONObject chứa một chìa khóa cụ.

Ví dụ

JSONObject JsonObj = new JSONObject(Your_API_STRING); //JSONObject is an unordered collection of name/value pairs 

if (JsonObj.has("address")) { 
    //Checking address Key Present or not 
    String get_address = JsonObj .getString("address"); // Present Key 
} 
else { 
    //Do Your Staff 
} 
2

Một cách tốt hơn, thay vì sử dụng một như có điều kiện:

if (json.has("club")) { 
    String club = json.getString("club")); 
} 

chỉ đơn giản là sử dụng OPTSTRING phương pháp hiện tại(), như thế này:

String club = json.optString("club); 

phương thức optString ("key") sẽ trả về một Chuỗi rỗng f chìa khóa không tồn tại và sẽ không, do đó, ném bạn một ngoại lệ.

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