จะตรวจสอบได้อย่างไรว่ามีคีย์ json อยู่หรือไม่


165

ดังนั้นฉันได้รับค่า JSON จากเซิร์ฟเวอร์ แต่ไม่รู้ว่าจะมีฟิลด์ใดฟิลด์หนึ่งหรือไม่

ชอบมาก:

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

และบางครั้งจะมีฟิลด์พิเศษเช่น:

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

ฉันต้องการตรวจสอบว่ามีฟิลด์ชื่อ "สโมสร" อยู่หรือไม่เพื่อแยกวิเคราะห์ฉันจะไม่ได้รับorg.json.JSONException: ไม่มีค่าสำหรับสโมสร


if (jsonObject.getString ("club")! = null) {// รับ vale ที่นี่}
ซอฟต์แวร์ Sainath

3
ไม่ยกเว้นการจัดการโค้ดจะหยุดทำงานและการดำเนินการวิเคราะห์คำต่อไปจะไม่ทำงาน
Adam Varhegyi

1
@SoftwareSainath ไม่ทำงาน แต่ยังได้รับการยกเว้น
Adam Varhegyi

String clubvalue = ""; ลอง (clubvalue = jsonobject.getString ("สโมสร");} catch (ข้อยกเว้น e) {}
ซอฟต์แวร์ Sainath

คำตอบ:


266

คลาส JSONObject มีเมธอดชื่อ "has":

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

ผลตอบแทนจริงถ้าวัตถุนี้มีการทำแผนที่สำหรับชื่อ การแมปอาจเป็น NULL


28
เพราะ "บรรจุ" ซ้ำซากเกินไปเหรอ? :)
Omri374

เกิดอะไรขึ้นถ้าคีย์มาจากIntegerประเภท?
Eido95

2
@ Eido95 ที่มีIntegerคีย์เป็นฟังก์ชั่นที่ไม่ดี JSON ควรมีคีย์ String และค่าของสิ่งที่คุณต้องการ
Nico

@ Eido95 ฉันเชื่อว่าจำนวนเต็มมีค่าอยู่เสมอทุกครั้งที่คุณประกาศจำนวนเต็มคุณต้องเริ่มต้นด้วยค่า
mut tony

154

คุณสามารถตรวจสอบวิธีนี้ได้ที่ 'HAS' - คืนค่าจริงถ้าวัตถุนี้มีการจับคู่ชื่อ การแมปอาจเป็น NULL

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

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

คุณยังสามารถตรวจสอบได้โดยใช้ 'isNull' - คืนค่าจริงถ้าวัตถุนี้ไม่มีการแมปชื่อหรือมีการแมปที่มีค่าเป็น NULL

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

1
คุณใช้ lib แบบไหนใน json คุณสามารถให้ตัวอย่างง่ายๆสำหรับ json-smart หรือ json-simple
samuel owino

@samuelowino json เป็นตัวแปรที่มีวัตถุของคุณ
Fernando Torres

17

คุณสามารถJSONObject#has, การให้บริการที่keyเป็น input และตรวจสอบว่าวิธีการที่ผลตอบแทนหรือtrue falseคุณสามารถ

ใช้optStringแทนgetString:

ส่งคืนค่าที่แม็พด้วยชื่อหากมีอยู่บังคับใช้หากจำเป็น ส่งคืนสตริงว่างถ้าไม่มีการแม็พนั้นอยู่


1
แม้ว่าวิธีการนี้อาจใช้กับผู้อื่นวิธีนี้จะไม่ส่งคืนหากมีค่าอยู่ หากgetStringจะได้กลับสตริงที่ว่างเปล่าoptStringก็จะกลับมาสตริงที่ว่างเปล่า สมมติว่าคุณเชื่อว่าทรัพย์สินไม่สามารถใช้งานได้ในสถานการณ์ของ OP
halfpastfour.am

@Blackbelt คุณมีแหล่งที่มาสำหรับสิ่งนี้หรือไม่?
tsuz

10

คุณสามารถใช้ได้ has

public boolean has(String key)

ตรวจสอบว่าJSONObjectมีคีย์ที่เฉพาะเจาะจง

ตัวอย่าง

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
}

10

ตรวจสอบรหัสก่อนอ่าน

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
}

นิยามฟังก์ชัน isNull

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

เอกสารอย่างเป็นทางการด้านล่างลิงค์สำหรับisNullฟังก์ชั่น

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


2

ลองสิ่งนี้

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

2
isNullที่จริงแล้วมีไว้สำหรับตรวจสอบว่าการทำแผนที่เป็นโมฆะไม่ใช่เพื่อตรวจสอบความพร้อมใช้งานของสมาชิก json
Reza_Rg

2

วิธีที่ดีกว่าแทนที่จะใช้เงื่อนไขอย่างเช่น:

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

คือการใช้วิธีที่มีอยู่ optString () เช่นนี้:

String club = json.optString("club);

วิธี optString ("key") จะส่งคืนสตริงว่างถ้าไม่มีคีย์และจะไม่ส่งผลให้คุณยกเว้น


2

json containsKey()มีวิธีการที่เรียกว่า

คุณสามารถใช้มันเพื่อตรวจสอบว่ามีบางคีย์อยู่ในชุด Json หรือไม่

File jsonInputFile = new File("jsonFile.json"); 
InputStream is = new FileInputStream(jsonInputFile);
JsonReader reader = Json.createReader(is);
JsonObject frameObj = reader.readObject();
reader.close();

if frameObj.containsKey("person") {
      //Do stuff
}

1
I used hasOwnProperty('club')

var myobj = { "regatta_name":"ProbaRegatta",
    "country":"Congo",
    "status":"invited"
 };

 if ( myobj.hasOwnProperty("club"))
     // do something with club (will be false with above data)
     var data = myobj.club;
 if ( myobj.hasOwnProperty("status"))
     // do something with the status field. (will be true with above ..)
     var data = myobj.status;

ทำงานในเบราว์เซอร์ปัจจุบันทั้งหมด



1

คุณสามารถลองใช้วิธีนี้เพื่อตรวจสอบว่ามีคีย์อยู่หรือไม่:

JSONObject object = new JSONObject(jsonfile);
if (object.containskey("key")) {
  object.get("key");
  //etc. etc.
}

0

ฉันเพียงแค่เพิ่มสิ่งอื่นในกรณีที่คุณเพียงต้องการที่จะตรวจสอบว่าสิ่งที่ถูกสร้างขึ้นใน JSONObject หรือไม่ว่าคุณสามารถใช้ความยาว () เพราะโดยค่าเริ่มต้นเมื่อ JSONObject จะเริ่มต้นและที่สำคัญไม่ได้ใส่มันก็มีการจัดฟันที่ว่างเปล่า{}และการใช้มี (คีย์สตริง) ไม่สมเหตุสมผล

ดังนั้นคุณสามารถเขียนif (jsonObject.length() > 0)และทำสิ่งต่าง ๆ ของคุณได้โดยตรง

เรียนรู้อย่างมีความสุข!


0

คุณสามารถใช้JsonNode # hasNonNull (String fieldName)มันผสมวิธีมีและการตรวจสอบว่าเป็นค่า Nullหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.