ממשק API לסטרימינג של ג'קסון

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

במאמר זה נבחן את ממשק ה- API של Streaming של ג'קסון הוא תומך בקריאה וכתיבה, ובאמצעותה אנו יכולים לכתוב מנתחי JSON בעלי ביצועים גבוהים ומהירים.

מצד שני, זה קצת קשה להשתמש - כל פרט של נתוני JSON צריך להיות מטופל במפורש בקוד.

2. תלות של Maven

ראשית, עלינו להוסיף תלות ב- Maven ל- ג'קסון-ליבה:

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. כתיבה ל- JSON

אנחנו יכולים לכתוב תוכן JSON ישירות ל- OutputStream באמצעות א JsonGenerator מעמד. ראשית, עלינו ליצור מופע של אובייקט זה:

זרם ByteArrayOutputStream = ByteArrayOutputStream חדש (); JsonFactory jfactory = JsonFactory חדש (); JsonGenerator jGenerator = jfactory .createGenerator (זרם, JsonEncoding.UTF8);

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

{"name": "Tom", "age": 25, "address": ["Poland", "Avenue 5"]}

אנו יכולים להשתמש במופע של ה- JsonGenerator לכתוב שדות ספציפיים ישירות אל OutputStream:

jGenerator.writeStartObject (); jGenerator.writeStringField ("שם", "טום"); jGenerator.writeNumberField ("גיל", 25); jGenerator.writeFieldName ("כתובת"); jGenerator.writeStartArray (); jGenerator.writeString ("פולין"); jGenerator.writeString ("השדרה החמישית"); jGenerator.writeEndArray (); jGenerator.writeEndObject (); jGenerator.close ();

כדי לבדוק אם נוצר JSON תקין, אנו יכולים ליצור חוּט אובייקט עם אובייקט JSON בתוכו:

מחרוזת json = מחרוזת חדשה (stream.toByteArray (), "UTF-8"); assertEquals (json, "{\" name \ ": \" Tom \ ", \" age \ ": 25, \" address \ ": [\" Poland \ ", \" השדרה החמישית \ "]}");

4. ניתוח JSON

כשאנחנו מקבלים JSON חוּט כקלט, ואנחנו רוצים לחלץ ממנו שדות ספציפיים, א JsonParser ניתן להשתמש בכיתה:

מחרוזת json = "{\" שם \ ": \" טום \ ", \" גיל \ ": 25, \" כתובת \ ": [\" פולין \ ", \" השדרה החמישית \ "]}"; JsonFactory jfactory = JsonFactory חדש (); JsonParser jParser = jfactory.createParser (json); מחרוזת parsedName = null; מספר שלם parsedAge = null; כתובות רשימות = LinkedList חדש ();

אנחנו רוצים להשיג parsedName, parsedAge וכתובות שדות מקלט JSON. כדי להשיג זאת, עלינו להתמודד עם לוגיקת הניתוח ברמה נמוכה וליישם אותה בעצמנו:

בעוד (jParser.nextToken ()! = JsonToken.END_OBJECT) {שם מחרוזת = jParser.getCurrentName (); אם ("שם" .שווה (שם שדה)) {jParser.nextToken (); parsedName = jParser.getText (); } אם ("גיל" .שווה (שם שדה)) {jParser.nextToken (); parsedAge = jParser.getIntValue (); } אם ("כתובת". שווה (שם שדה)) {jParser.nextToken (); בעוד (jParser.nextToken ()! = JsonToken.END_ARRAY) {address.add (jParser.getText ()); }}} jParser.close ();

בהתאם לשם השדה, אנו מחלצים אותו ומקצים לשדה מתאים. לאחר הניתוח של המסמך, על כל השדות לכלול נתונים נכונים:

assertEquals (parsedName, "טום"); assertEquals (parsedAge, (Integer) 25); assertEquals (כתובות, Arrays.asList ("פולין", "השדרה החמישית"));

5. חילוץ חלקי JSON

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

באופן אידיאלי, במצבים אלה, אנו רוצים לנתח את תחילת המסמך בלבד, ולאחר שנמצא השדה הדרוש, אנו יכולים לבטל את העיבוד.

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

ואילו (jParser.nextToken ()! = JsonToken.END_OBJECT) {שם מחרוזת = jParser.getCurrentName (); אם ("גיל" .שווה (שם שדה)) {jParser.nextToken (); parsedAge = jParser.getIntValue (); לַחֲזוֹר; }} jParser.close ();

לאחר העיבוד, היחיד parsedAge לשדה יהיה ערך:

assertNull (parsedName); assertEquals (parsedAge, (Integer) 25); assertTrue (addresses.isEmpty ());

הודות לכך, הניתוח של מסמך JSON יהיה מהיר הרבה יותר מכיוון שאיננו צריכים לקרוא את כל המסמך אלא רק חלק קטן ממנו.

6. מסקנה

במאמר מהיר זה, אנו בוחנים כיצד אנו יכולים למנף את ה- API לעיבוד זרם מתוך ג'קסון.

ניתן למצוא את היישום של כל הדוגמאות וקטעי הקוד ב- GitHub - זהו פרויקט של Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.


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