עיבוד JSON ב- Java EE 7

1. סקירה כללית

מאמר זה יראה לכם כיצד לעבד את JSON רק באמצעות Java EE הליבה, ללא שימוש בתלות של צד שלישי כמו ג'רזי או ג'קסון. כמעט כל מה שנשתמש בו מסופק על ידי חבילת javax.json.

2. כתיבת אובייקט ל- JSON חוּט

המרת אובייקט Java ל- JSON חוּט זה סופר קל. נניח שיש לנו פשוט אדם מעמד:

אדם בכיתה ציבורית {שם פרטי פרטי מחרוזת; שם משפחה פרטי מחרוזת; תאריך לידה פרטי תאריך; // גטרים וקובעים}

להמיר מופע של אותה מחלקה ל- JSON חוּטראשית עלינו ליצור מופע של JsonObjectBuilder והוסף זוגות מאפיינים / ערך באמצעות ה- לְהוֹסִיף() שיטה:

ObjectBuilder JsonObjectBuilder = Json.createObjectBuilder () .add ("firstName", person.getFirstName ()) .add ("lastName", person.getLastName ()) .add ("תאריך לידה", SimpleDateFormat חדש ("DD / MM / YYYYY "). פורמט (person.getBirthdate ()));

שימו לב שה- לְהוֹסִיף() לשיטה יש כמה גרסאות עמוסות. הוא יכול לקבל את רוב הסוגים הפרימיטיביים (כמו גם אובייקטים ממוסגרים) כפרמטר השני שלו.

לאחר שסיימנו להגדיר את המאפיינים עלינו רק לכתוב את האובייקט ל- a חוּט:

JsonObject jsonObject = objectBuilder.build (); מחרוזת jsonString; נסה (סופר סופר = מחרוזת חדשה ()) {Json.createWriter (סופר) .write (jsonObject); jsonString = author.toString (); }

וזה הכל! הנוצר חוּט ייראה כך:

{"firstName": "Michael", "lastName": "Scott", "תאריך לידה": "15/06/1978"}

2.1. באמצעות JsonArrayBuilder לבנות מערכים

עכשיו, כדי להוסיף קצת יותר מורכבות לדוגמא שלנו, נניח שה- אדם class השתנה כדי להוסיף מאפיין חדש בשם מיילים שתכיל רשימה של כתובות דוא"ל:

אדם בכיתה ציבורית {שם פרטי פרטי מחרוזת; שם משפחה פרטי מחרוזת; תאריך לידה פרטי תאריך; דוא"ל רשימת פרטיות; // גטרים וקובעים}

כדי להוסיף את כל הערכים מרשימה זו ל- JsonObjectBuilder נצטרך את העזרה של JsonArrayBuilder:

JsonArrayBuilder arrayBuilder = Json.createArrayBuilder (); עבור (דוא"ל מחרוזת: person.getEmails ()) {arrayBuilder.add (דוא"ל); } objectBuilder.add ("מיילים", arrayBuilder);

שימו לב שאנחנו משתמשים בגרסה עמוסה נוספת של ה- לְהוֹסִיף() שיטה שלוקחת א JsonArrayBuilder האובייקט כפרמטר השני שלו.

אז בואו נסתכל על המחרוזת שנוצרה עבור אדם אובייקט עם שתי כתובות דוא"ל:

{"firstName": "Michael", "lastName": "Scott", "תאריך לידה": "15/06/1978", "emails": ["[email protected]", "[email protected]"]}

2.2. עיצוב הפלט באמצעות PRETTY_PRINTING

אז המירו אובייקט Java בהצלחה ל- JSON תקף חוּט. כעת, לפני שעברנו לסעיף הבא, בואו נוסיף עיצוב פשוט כדי להפוך את הפלט ליותר "דמוי JSON" וקל יותר לקריאה.

בדוגמאות הקודמות יצרנו א JsonWriter באמצעות הפשוטה ג'סון.createWriter () שיטה סטטית. על מנת לקבל יותר שליטה על הנוצר חוּט, ננצל את Java 7's JsonWriterFactory יכולת ליצור סופר עם תצורה ספציפית.

תצורת המפה = HashMap חדש (); config.put (JsonGenerator.PRETTY_PRINTING, נכון); JsonWriterFactory writerFactory = Json.createWriterFactory (config); מחרוזת jsonString; נסה (סופר סופר = חדש StringWriter ()) {writerFactory.createWriter (סופר) .write (jsonObject); jsonString = author.toString (); }

הקוד אולי נראה קצת מילולי, אבל הוא באמת לא עושה הרבה.

ראשית, זה יוצר מופע של JsonWriterFactory העברת מפת תצורה לבונה שלה. המפה מכילה רק ערך אחד המוגדר נכון למאפיין PRETTY_PRINTING. לאחר מכן אנו משתמשים במופע זה של המפעל כדי ליצור סופר במקום להשתמש בו Json.createWriter ().

הפלט החדש יכיל את מעברי השורות הייחודיים ואת הטבלה המאפיינת JSON חוּט:

{"firstName": "Michael", "lastName": "Scott", "תאריך לידה": "15/06/1978", "emails": ["[email protected]", "[email protected]"]}

3. בניית ג'אווה לְהִתְנַגֵד מ חוּט

עכשיו בואו נעשה פעולה הפוכה: להמיר JSON חוּט לתוך אובייקט Java.

החלק העיקרי בתהליך הגיור נסוב סביב JsonObject. כדי ליצור מופע של מחלקה זו, השתמש בשיטה הסטטית Json.createReader () בא אחריו readObject ():

קורא JsonReader = Json.createReader (StringReader חדש (jsonString)); JsonObject jsonObject = reader.readObject ();

ה createReader () שיטה לוקח InputStream כפרמטר. בדוגמה זו אנו משתמשים ב- StringReader, מאז JSON שלנו כלול א חוּט אובייקט, אך ניתן להשתמש באותה שיטה לקריאת תוכן מקובץ, למשל באמצעות FileInputStream.

עם מופע של JsonObject בהישג יד, אנו יכולים לקרוא את המאפיינים באמצעות ה- getString () שיטה ולהקצות את הערכים שהושגו למופע חדש שנוצר שלנו אדם מעמד:

אדם אדם = אדם חדש (); person.setFirstName (jsonObject.getString ("שם ראשון")); person.setLastName (jsonObject.getString ("שם משפחה")); person.setBirthdate (dateFormat.parse (jsonObject.getString ("תאריך לידה"));

3.1. באמצעות JsonArray להשיג רשימה ערכים

נצטרך להשתמש בשיעור מיוחד שנקרא JsonArray כדי לחלץ ערכי רשימה JsonObject:

JsonArray emailsJson = jsonObject.getJsonArray ("מיילים"); רשימת מיילים = ArrayList חדש (); עבור (JsonString j: emailsJson.getValuesAs (JsonString.class)) {emails.add (j.getString ()); } person.setEmails (אימיילים);

זהו זה! יצרנו מופע שלם של אדם מג'סון חוּט.

4. שאילתת ערך

עכשיו, נניח שאנחנו מעוניינים בנתונים מאוד ספציפיים שנמצאים בתוך JSON חוּט.

שקול את JSON להלן המייצג לקוח מחנות חיות מחמד. בואו נגיד שמשום מה עליכם לרשום את שם חיית המחמד השלישית מרשימת חיות המחמד:

{"ownerName": "Robert", "pets": [{"name": "Kitty", "type": "cat"}, {"name": "Rex", "type": "dog"}, {"name": "Jake", "type": "dog"}]}

המרת כל הטקסט לאובייקט Java רק כדי לקבל ערך יחיד לא תהיה יעילה במיוחד. אז בואו נבדוק כמה אסטרטגיות לשאילתת JSON מיתרים בלי צורך לעבור את כל מצוקת הגיור.

4.1. שאילתות באמצעות API של מודל אובייקט

שאילתת ערך לנכס עם מיקום ידוע במבנה JSON היא פשוטה. אנו יכולים להשתמש במופע של JsonObject, אותה מחלקה ששימשה בדוגמאות הקודמות:

קורא JsonReader = Json.createReader (StringReader חדש (jsonString)); JsonObject jsonObject = reader.readObject (); מחרוזת searchResult = jsonObject .getJsonArray ("חיות מחמד") .getJsonObject (2) .getString ("שם"); 

המלכוד כאן הוא לנווט jsonObject מאפיינים המשתמשים ברצף הנכון של לקבל*() שיטות.

בדוגמה זו, אנו מקבלים תחילה הפניה לרשימת "חיות מחמד" באמצעות getJsonArray (), שמחזירה רשימה עם 3 רשומות. ואז, אנו משתמשים getJsonObject () שיטה, שלוקחת אינדקס כפרמטר, ומחזירה אחר JsonObject המייצג את הפריט השלישי ברשימה. לבסוף, אנו משתמשים getString () כדי לקבל את ערך המחרוזת שאנחנו מחפשים.

4.2. שאילתות באמצעות ממשק API

דרך נוספת לבצע שאילתות מדויקות ב- JSON חוּט משתמש בממשק ה- API של סטרימינג, שיש לו JsonParser כמעמד העיקרי שלה.

JsonParser מספק גישה מהירה וקריאה בלבד לקדימה ל- JS, עם החיסרון של להיות קצת יותר מסובך ממודל האובייקט:

JsonParser jsonParser = Json.createParser (StringReader חדש (jsonString)); ספירת int = 0; תוצאת מחרוזת = null; בעוד (jsonParser.hasNext ()) {אירוע e = jsonParser.next (); אם (e == Event.KEY_NAME) {if (jsonParser.getString (). שווה ("שם")) {jsonParser.next (); אם (++ count == 3) {result = jsonParser.getString (); לשבור; }}}}

דוגמה זו מספקת תוצאה זהה לזו הקודמת. זה מחזיר את שֵׁם מחיית המחמד השלישית ב חיות מחמד רשימה.

פעם אחת JsonParser נוצר באמצעות Json.createParser (), עלינו להשתמש באיטרטור (ומכאן אופי ה"גישה הקדמית ") JsonParser) כדי לנווט בין אסימוני JSON עד שנגיע לנכס (או הנכסים) שאנחנו מחפשים.

בכל פעם שאנחנו עוברים דרך האיטרציה אנו עוברים לאסימון הבא של נתוני JSON. אז עלינו להקפיד לבדוק אם לאסימון הנוכחי יש את הסוג הצפוי. זה נעשה על ידי בדיקת ה- מִקרֶה הוחזר על ידי הַבָּא() שִׂיחָה.

ישנם סוגים רבים ושונים של אסימונים. בדוגמה זו אנו מעוניינים ב- KEY_NAME סוגים, המייצגים את שם הנכס (למשל "בעל שם", "חיות מחמד", "שם", "סוג"). פעם אחת עברנו דרך א KEY_NAME אסימון עם ערך של "שם" בפעם השלישית, אנו יודעים שהאסימון הבא יכיל ערך מחרוזת המייצג את שמו של חיית המחמד השלישית מהרשימה.

זה בהחלט קשה יותר משימוש ב- API של Object Model, במיוחד עבור מבני JSON מסובכים יותר. הבחירה בין זה לזה, כתמיד, תלויה בתרחיש הספציפי איתו תעסוק.

5. מסקנה

כיסינו הרבה אדמות בממשק ה- API לעיבוד Java EE JSON עם כמה דוגמאות פשוטות. כדי ללמוד דברים מגניבים אחרים על עיבוד JSON, עיין בסדרת המאמרים שלנו על ג'קסון.

בדוק את קוד המקור של הכיתות המשמשות במאמר זה, כמו גם כמה מבחני יחידות במאגר GitHub שלנו.


$config[zx-auto] not found$config[zx-overlay] not found