התבוסס על מקרה של org.json.JSONObject
1. הקדמה
במדריך זה נבחן כמה גישות לאיתור מעל א JSONObject, ייצוג JSON פשוט עבור Java.
נתחיל בפתרון נאיבי ואז נראה משהו קצת יותר חזק.
2. חידוד דרך א JSONObject
נתחיל עם המקרה הפשוט של איטרציה של JSON של זוגות ערך-שם:
{"name": "Cake", "cakeId": "0001", "cakeShape": "Heart"}
בשביל זה אנחנו יכולים פשוט חזור באמצעות המקשים באמצעות מקשים () שיטה:
handle handleJSONObject (JSONObject jsonObject) {jsonObject.keys (). forEachRemaining (key -> {Object value = jsonObject.get (key); logger.info ("Key: {0} \ tValue: {1}", key, value) );}}
והתפוקה שלנו תהיה:
מפתח: שם ערך: עוגה מפתח: עוגה ערך ערך: 0001 מפתח: עוגה ערך צורה: לב
3. חוצה דרך א JSONObject
אבל בואו נגיד שיש לנו מבנה מורכב יותר:
{"batters": [{"type": "Regular", "id": "1001"}, {"type": "Chocolate", "id": "1002"}, {"type": "BlueBerry" , "id": "1003"}], "name": "עוגה", "cakeId": "0001"}
מה המשמעות של איטרציה דרך המקשים במקרה זה?
בואו נסתכל על מה הנאיבי שלנו מקשים () גישה תתן לנו:
מפתח: batters ערך: [{"type": "רגיל", "id": "1001"}, {"type": "שוקולד", "id": "1002"}, {"type": "BlueBerry" , "id": "1003"}] מפתח: שם ערך: עוגה מפתח: ערך עוגה: 0001
זה אולי לא ממש מועיל. זה נראה כמו מה אנו רוצים במקרה זה לא איטרציה, אלא מעבר.
חוצה דרך א JSONObject שונה מאיטרציה דרך א JSONObjectערכת המפתחות.
לזה, אנחנו בעצם צריכים לבדוק גם את סוג הערך. בואו נדמיין שאנחנו עושים זאת בשיטה נפרדת:
void handleValue (ערך אובייקט) {if (ערך מופע של JSONObject) {handleJSONObject ((JSONObject) ערך); } אחרת אם (ערך ערך של JSONArray) {handleJSONArray ((JSONArray) ערך); } אחר {logger.info ("ערך: {0}", ערך); }}
ואז, הגישה שלנו עדיין דומה למדי:
handle handleJSONObject (JSONObject jsonObject) {jsonObject.keys (). forEachRemaining (key -> {Object value = jsonObject.get (key); logger.info ("Key: {0}", key); handleValue (value);} ); }
הדבר היחיד הוא שאנחנו צריכים לחשוב איך לטפל במערכים.
4. חוצה דרך א JSON מערך
בואו ננסה לשמור על גישה דומה של שימוש באיטרציה. במקום להתקשר מקשים ()עם זאת, אנחנו נתקשר איטרטור ():
handled בטל JSONArray (JSONArray jsonArray) {jsonArray.iterator (). forEachRemaining (element -> {handleValue (element)}); }
עכשיו, פתרון זה מגביל כי אנו משלבים מעבר עם הפעולה שאנו רוצים לבצע. גישה נפוצה להפרדת השניים היא שימוש בתבנית המבקרים.
5. מסקנה
במאמר זה ראינו דרך לחזור על א JSONObject עבור זוגות פשוטים של שם-ערך, הבעיה הקשורה למבנים מורכבים וטכניקה חוצה לפתור אותה.
כמובן, זו הייתה שיטת מעבר ראשונה לעומק, אבל יכולנו לעשות רוחב ראשון בדרך דומה.
הקוד השלם לדוגמא זמין ב- Github.