มีอะไรอยู่ในวัตถุ / อาร์เรย์ JSON ที่ไม่รู้จัก

ฉันต้องการรับรายชื่อเพื่อนจาก Facebook API ใน Android ในกระบวนการนั้น ฉันต้องการเรียนรู้วิธีอ่านอ็อบเจ็กต์/อาร์เรย์ JSON

ฉันมี JSONObject และ/หรือ JSONArrays ที่ถูกส่งมาให้ฉัน ฉันไม่รู้ว่ามีอะไรอยู่ในนั้น*. ฉันรู้วิธีอ่านข้อมูลเมื่อรู้ว่ามีฟิลด์ใดบ้าง แต่ฉันไม่สามารถอ่านอะไรได้เลยหากไม่มีคีย์ แม้จะมีกุญแจอยู่ ฉันจะบอกได้อย่างไรว่ามีอะไรอยู่ในนั้น?

โดยพื้นฐานแล้ว ฉันต้องการโค้ดที่มีลักษณะดังนี้:

JSONArray mArray = response.getJSONArray();
String theEntireDatabase = mArray.getStringOFEntireDatabase();

และให้มันตอบกลับด้วย String ที่มีลักษณะดังนี้:

{
   "phoneNumber": [
      {
         "type": "work",
         "num": "11111"
      },
      {
         "type": "home",
         "num": "2222"
      }
   ],
   "address": {
      "state": "World",
      "address": "infinite space, 000",
      "city": "Android city"
   },
   "surname": "Swa",
   "name": "Android"
}

โดยไม่รู้มาก่อนว่ามีอะไรบ้างในฐานข้อมูล?

*อาจเป็น "สี:" อาจเป็น "ระดับภัยคุกคามทางนิวเคลียร์:" สำหรับทั้งหมดที่ฉันรู้

ฉันลองสิ่งนี้ แต่มันให้เฉพาะคีย์: Javascript รับชื่อคีย์ JSON


person Glen Pierce    schedule 28.07.2015    source แหล่งที่มา


คำตอบ (4)


JSONArray mArray = response.getJSONArray();
String theEntireDatabase = mArray.toString();

สิ่งนี้น่าจะทำงานได้ดี
หากคุณต้องการให้ JSONArray พิมพ์ออกมาสวยงาม คุณสามารถเพิ่มส่วนนี้ได้หลังจากโค้ดที่ฉันเพิ่งให้ไป

Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(theEntireDatabase);
String prettyJsonString = gson.toJson(je); 
person arodriguezdonaire    schedule 28.07.2015

JSONObject#keys จะบอกคุณว่าคีย์ใดที่กำหนดไว้สำหรับวัตถุ . JSONArray#length จะบอกคุณว่ามีกี่รายการในอาร์เรย์ (และดังนั้นช่วงของค่าที่คุณสามารถใช้สำหรับ index ด้วยวิธีอื่น: 0 ถึง length() - 1) JSONObject#toString/JSONArray#toString จะให้สตริงที่คุณขอ

person T.J. Crowder    schedule 28.07.2015

ดูคุณสมบัติโมเดลต้นไม้ในตัวของ Jacksons http://wiki.fasterxml.com/JacksonTreeModel

และรหัสของคุณจะเป็น:

public void parse(String json)  {
       JsonFactory factory = new JsonFactory();

       ObjectMapper mapper = new ObjectMapper(factory);
       JsonNode rootNode = mapper.readTree(json);  

       Iterator<Map.Entry<String,JsonNode>> fieldsIterator = rootNode.fields();
       while (fieldsIterator.hasNext()) {

           Map.Entry<String,JsonNode> field = fieldsIterator.next();
           System.out.println("Key: " + field.getKey() + "\tValue:" + field.getValue());
       }
}
person Archit Garg    schedule 28.07.2015

นอกเหนือจากคำตอบทางเทคนิค (JSONObject#toString(n) ดูเหมือนง่ายที่สุด - ดู http://developer.android.com/reference/org/json/JSONObject.html)

ฉันมักจะใช้วิธีแก้ปัญหาเชิงปฏิบัติอีกสองวิธี:

  1. มองหาเอกสาร API... ฉันรู้ว่ามันฟังดูบ้า แต่บางบริษัทก็เสนอเรื่องแบบนั้น
  2. แฮ็กสคริปต์จาวาสคริปต์สั้น ๆ เข้าด้วยกันเพื่อลองใช้ API และตรวจสอบผลลัพธ์ในคอนโซลนักพัฒนาซอฟต์แวร์/firebug/อะไรก็ได้ที่มีประโยชน์
person cypherabe    schedule 28.07.2015
comment
การอ้างอิงของนักพัฒนาอาจทำให้หงุดหงิดเล็กน้อย แต่การค้นหาเมธอด .toString() ถือเป็นกุญแจสำคัญ - person Glen Pierce; 28.07.2015