המרת JSON ל- CSV בג'אווה

1. הקדמה

במדריך קצר זה נראה כיצד להשתמש בג'קסון להמרת JSON ל- CSV ולהיפך.

ישנן ספריות חלופיות זמינות, כמו מחלקת CDL מבית org.json, אך רק נתמקד בספריית ג'קסון כאן.

לאחר שבדקנו את מבנה הנתונים לדוגמה שלנו, נשתמש בשילוב של ObjectMapper ו- CSVMapper להמרה בין JSON ל- CSV.

2. תלות

בואו להוסיף את התלות במעצב הנתונים של ג'קסון CSV:

 com.fasterxml.jackson.dataformat jackson-dataformat-csv 2.11.1 

אנחנו תמיד יכולים למצוא את הגרסה העדכנית ביותר של תלות זו ב- Maven Central.

נוסיף גם את התלות במאגר המידע המרכזי של ג'קסון:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

שוב, אנו יכולים למצוא את הגרסה האחרונה של תלות זו ב- Maven Central.

3. מבנה נתונים

לפני שנפרמט מחדש מסמך JSON ל- CSV, עלינו לשקול עד כמה מודל הנתונים שלנו ימפה בין שני הפורמטים.

אז ראשית, הבה נבחן באילו נתונים התומכים הפורמטים השונים:

  • אנו משתמשים ב- JSON כדי לייצג מגוון של מבני עצמים, כולל כאלה המכילים מערכים ואובייקטים מקוננים
  • אנו משתמשים ב- CSV כדי לייצג נתונים מרשימת אובייקטים, כאשר כל אובייקט מהרשימה מופיע בשורה חדשה

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

[{"item": "No. 9 Sprockets", "כמות": 12, "unitPrice": 1.23}, {"item": "Widget (10mm)", "כמות": 4, "unitPrice": 3.45} ]

נשתמש בשמות השדות ממסמך JSON ככותרות עמודות ונפרמט אותו מחדש לקובץ ה- CSV הבא:

פריט, כמות, יחידה מחיר "מס '9 גלגל שיניים", 12,1.23 "יישומון (10 מ"מ)", 4,3.45

4. קרא את JSON וכתוב CSV

ראשית, אנו משתמשים בג'קסון ObjectMapper לקרוא את מסמך JSON לדוגמה שלנו לעץ של JsonNode חפצים:

JsonNode jsonTree = ObjectMapper חדש (). ReadTree (קובץ חדש ("src / main / resources / orderLines.json"));

לאחר מכן, בואו ליצור a CsvSchema. זה קובע את כותרות העמודות, הסוגים ורצף העמודות בקובץ ה- CSV. לשם כך אנו יוצרים בונה CsvSchema והגדר את כותרות העמודות כך שיתאימו לשמות השדות JSON:

בונה csvSchemaBuilder = CsvSchema.builder (); JsonNode firstObject = jsonTree.elements (). הבא (); firstObject.fieldNames (). forEachRemaining (fieldName -> {csvSchemaBuilder.addColumn (fieldName);}); CsvSchema csvSchema = csvSchemaBuilder.build (). WithHeader ();

לאחר מכן, אנו יוצרים a CsvMapper עם שלנו CsvSchemaולבסוף, אנו כותבים את jsonTree לקובץ ה- CSV שלנו:

CsvMapper csvMapper = חדש CsvMapper (); csvMapper.writerFor (JsonNode.class) .with (csvSchema) .writeValue (קובץ חדש ("src / main / resources / orderLines.csv"), jsonTree);

כאשר אנו מריצים קוד דוגמה זה, מסמך JSON לדוגמא שלנו מומר לקובץ ה- CSV הצפוי.

5. קרא CSV וכתוב JSON

עכשיו, בואו נשתמש בזה של ג'קסון CsvMapper לקרוא את קובץ ה- CSV שלנו לתוך א רשימה שֶׁל OrderLine חפצים. לשם כך, ראשית אנו יוצרים את OrderLine שיעור כ POJO פשוט:

מחלקה ציבורית OrderLine {פריט מחרוזת פרטי; כמות אינטנס פרטית; יחידת BigDecimal פרטית; // קונסטרוקטורים, גטרים, סטרים וטרינג}

נשתמש בכותרות העמודות בקובץ ה- CSV כדי להגדיר את שלנו CsvSchema. לאחר מכן, אנו משתמשים ב- CsvMapper לקרוא את הנתונים מ- CSV לתוך MappingIterator שֶׁל OrderLine חפצים:

CsvSchema orderLineSchema = CsvSchema.emptySchema (). WithHeader (); CsvMapper csvMapper = חדש CsvMapper (); MappingIterator orderLines = csvMapper.readerFor (OrderLine.class) .with (orderLineSchema) .readValues ​​(קובץ חדש ("src / main / resources / orderLines.csv"));

לאחר מכן נשתמש ב- MappingIterator לקבל רשימה שֶׁל OrderLine חפצים. ואז, אנחנו משתמשים בזה של ג'קסון ObjectMapper לכתוב את הרשימה כמסמך JSON:

ObjectMapper חדש () .configure (SerializationFeature.INDENT_OUTPUT, נכון) .writeValue (קובץ חדש ("src / main / resources / orderLinesFromCsv.json"), orderLines.readAll ());

כאשר אנו מריצים קוד דוגמה זה, קובץ ה- CSV לדוגמא שלנו מומר למסמך JSON הצפוי.

6. קביעת תצורה של פורמט קובץ CSV

בואו נשתמש בכמה מההערות של ג'קסון כדי להתאים את הפורמט של קובץ ה- CSV. נשנה את 'פריט' כותרת עמודה אל 'שֵׁם', ה 'כַּמוּת' כותרת עמודה אל 'לספור', הסר את 'מחיר ליחידה' טור, ולעשות 'לספור' הטור הראשון.

לכן, קובץ ה- CSV הצפוי שלנו הופך להיות:

ספירה, שם 12, "מס '9 גלגלי שיניים" 4, "יישומון (10 מ"מ)"

ניצור מחלקה מופשטת חדשה להגדרת הפורמט הנדרש עבור קובץ ה- CSV:

@JsonPropertyOrder ({"count", "name"}) מחלקה מופשטת ציבורית OrderLineForCsv {@JsonProperty ("name") פריט מחרוזת; @JsonProperty ("ספירה") כמות אינטנסיבית פרטית; @Json התעלם מה- BigDecimal unitPrice; }

ואז, אנו משתמשים שלנו OrderLineForCsv מחלקה ליצור CsvSchema:

CsvMapper csvMapper = חדש CsvMapper (); CsvSchema csvSchema = csvMapper .schemaFor (OrderLineForCsv.class) .withHeader (); 

אנו משתמשים גם ב- OrderLineForCsv בתור ג'קסון מיקסין. זה אומר לג'קסון להשתמש בהערות שהוספנו ל OrderLineForCsv כיתה כאשר הוא מעבד OrderLine לְהִתְנַגֵד:

csvMapper.addMixIn (OrderLine.class, OrderLineForCsv.class); 

לבסוף, אנו משתמשים ב- ObjectMapper לקרוא את מסמך JSON שלנו לתוך OrderLine מערך, והשתמש שלנו csvMapper לכתוב את זה לקובץ CSV:

OrderLine [] orderLines = ObjectMapper חדש () .readValue (קובץ חדש ("src / main / resources / orderLines.json"), OrderLine []. Class); csvMapper.writerFor (OrderLine []. class) .with (csvSchema) .writeValue (קובץ חדש ("src / main / resources / orderLinesReformated.csv"), orderLines); 

כאשר אנו מריצים קוד דוגמה זה, מסמך JSON לדוגמא שלנו מומר לקובץ ה- CSV הצפוי.

7. מסקנה

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

כמו תמיד, ניתן למצוא את הקוד ב- GitHub.