«

»

Oct 23

עטיפת Json ב Jackson


עטיפת Json ב Jackson

 

 

רקע תאורטי:

 

כאשר מעבירים מידע לשרת או מקבלים מידע הוא בדרך כלל מועבר בפורמט להעברת מידע שקל ליצור ולפרסר. כדוגמאת xml או Json.

 

Json:

 

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

 

1. אובייקט שמבוסס על ערכי key/value. שהמבנה שלו הוא:
{ key: Value, key:Value… }
2. מערך שמכיל רשימה של ערכים. שהמבנה שלו הוא:
[ Value , Value …. ]
Value – יכול להיות String/Number/false/true/null אך הוא יכול להיות גם אובייקט ומערך.
אובייקט יכול להכיל String/Number/Boolean, אובייקט אחר או מערך.
מערך יכול להכיל רשימה של מערכים אחרים, רשימה של אובייקטים ורשימה של Strings/Number/Boolean.

 

Jackson:

 

אז בשביל מה דיברנו עד עכשיו על Json ואיפה נכנס הנושא של Jackson?
העברת ה json לשרת או קבלתו מהשרת דורשת יחסית הרבה עבודה, מכיוון שפרסור של String הוא תמיד נושא מאוד מעיק ודורש הרבה זמן ודיוק.
תארו לכם מבנה של json גדול ומסובך שאנחנו צריכים לשלוח או לקבל מהשרת.. זה הופך את הפרסור של ה Json להיות עבודה הרבה יותר מסובכת שדורשת הרבה זמן תכנות.

ה Jackson חוסך לנו את כל ההתעסקות עם פרסור ה String של ה Json ע”י יצרת מעטפת של אובייקט שממנו נוצר ה Jason.
 
 

דוגמה והסבר:

לדוגמא אם נרצה לשלוח json שמתאר שם של בן אדם, הכתובת שלו ורשימת הילדים שלו שצד השרת מצפה לקבל עם String=key שנקבעו מראש בצד השרת, אז לדוגמא ה Json יראה כך:

{
	"firstname" : "Lior",
	"lastname" : "Zivi",
	"address": {
		"country" : "Israel"
		"city" : "Hertzlia"
		},
	"children": 
        [
		{
		"childname" : "Aviram"
		"age" : 3
		},
		{
		"childname" : "Fruchtman"
		"age" : 4
                }
        ]
}
במקום ליצור את מחרוזת ה Json לשליחה באופן ידני, נשתמש ב Jackson:

 

1. נוסיף את שלושת ה jars של Jackson שמצורפים: Jackson-core-2.0.2.jar , Jackson-annotations-2.0.2.jar , Jackson-databind-2.0.2.jar לפרוייקט שלנו.

 

2. ניצור את המחלקות שמייצגות את ה json שנרצה לשלוח:

  public class Address {

	@JsonProperty private String country;
	@JsonProperty private String city;

במקרה שלא מגדירים את כל השדות כ public צריך בנאי דיפולטי בשביל שה Jackson יוכל למפות את הנתונים מה Jason לאובייקט. (אם מגדירים את כל השדות כ publie לא צריך בנאי)

	public Address() {
	}

	public Address(String country, String city) {

		this.country = country;
		this.city = city;

	}

}
public class Child {

	@JsonProperty private String childname;
	@JsonProperty private int age;

	public Child() {

	}

	public Child(String childname, int age) {

		this.childname = childname;
		this.age = age;

	}

}
public class Person {

	@JsonProperty("firstname") private String _firstname;

	@JsonProperty private String lastname;

	@JsonProperty private Address address;
	@JsonProperty private Child[] children;

	public Person() {

	}

	public Person(String firstname, String lastname, Address address, Child[] children) {

		this._firstname = firstname;
		this.lastname = lastname;
		this.address = address;
		this.children = children;

	}
מכיוון שיש לנו פה getter, אז Json ייחס אותו לשדה בשם firstName. מכיוון שאין לנו שדה כזה ואנחנו לא רוצים שיהיה exception בפרסור אנחנו מוסיפים את האנוטציה JsonIgnore@ שאומר ל Jason להתעלם מהשדה הזה.
אפשר להוסיף באופן כללי אנוטציה לכל המחלקה להתעלם מכל השדות שממפים לקריאה ע”י הוספת האנוטציה (JsonIgnoreProperties(ignoreUnknown = true@ מעל הגדרת המחלקה.
	@JsonIgnore
	public String getFirstName() {

		return this._firstname;
	}	

}
כאשר האנוטציה של ה JsonProperty@ אומר שאת השדה הזה צריך להמיר ל json.
כאשר לדוגמא:
	@JsonProperty public String firstname;
מייצג שה Key הוא בברירת המחדל שם הפרמטר, הלוא הוא: “firstname” וה Value יהיה הערך של ה String שמשויך למשתנה firstname.
אם נרצה ששם המשתנה לא יהיה מחרוזת ה key שנעביר בשביל שנוכל לשמור על מוסכמויות הכתיבה שלנו, נחריז על ה JasonPropery באנוטציה הבאה:
	@JsonProperty("firstname") public String _firstname;

כאשר השם בגרשיים הוא מחרוזת ה key שהוא ימפה את המשתנה אליו.

 

3. בשביל ליצור את ה json בעזרת Jackson:
אובייקט שאליו ה Jackson ירשום את ה json
StringWriter stringWriter = new StringWriter();

אובייקט Jackson שמבצע את ההמרה בפועל

ObjectMapper mapper = new ObjectMapper();
try {

כתיבת האובייקט בפועל ע”י Jackson ל stringWriter כ json.

	mapper.writeValue(stringWriter, lior);

המרת ה Json למחרוזת

	String jsonGenerated = stringWriter.toString();
}

 

4. בשביל ליצור אובייקטים ממחרוזת json בעזרת Jackson:
קריאה לאובייקט StringReader את מחרוזת ה Jason שלנו
    StringReader stringReader = new StringReader(json);

אובייקט Jackson שמבצע את ההמרה בפועל

ObjectMapper mapper = new ObjectMapper();
try {

המרת ה Json לאובייקט.

Person person = mapper.readValue(stringReader, Person.class);

 
 

לינק להורדת הפרויקט לדוגמה

 

בהצלחה !

Leave a Reply

Your email address will not be published.

אתם יכולים להשתמש באפשרויות ותגי ה-HTMLהבאים: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>