مرحبًا بك في دليل مثال جافا JSON. JSON (JavaScript Object Notation) هي تقنية خفيفة الوزن معتمدة على النص لإنشاء بيانات منسقة يمكن قراءتها بواسطة الإنسان. يتمثل JSON في بيانات الكائن بشكل أزواج المفاتيح والقيم. يمكننا أيضًا أن نكون لدينا كائنات JSON متداخلة وهو يوفر طريقة سهلة لتمثيل المصفوفات أيضًا.
Java JSON
يتم استخدام JSON على نطاق واسع في تطبيقات الويب أو كاستجابة من الخادم لأنه خفيف الوزن وأكثر كفاءة من XML. كائنات JSON سهلة القراءة والكتابة ومعظم التقنيات توفر الدعم لكائنات JSON. لهذا السبب، فإن JSON في خدمات الويب جافا شائعة جدا. JSR353 أصبح أخيرًا جزءًا من Java EE 7 وهو واجهة برمجة تطبيقات معالجة JSON في جافا. jsonp هو تنفيذ المرجعية لـ Java JSON Processing API. يمكننا استخدامها في مشروع مافن عن طريق إضافة التبعية التالية.
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.0.2</version>
</dependency>
إذا كنت تستخدم GlassFish 4.0 ، فيمكنك الاحتفاظ بالنطاق كما هو لأنه تم تضمينه بالفعل في الخادم. يوفر واجهة برمجة التطبيقات JSON طريقتين لمعالجة JSON:
- نموذج كائن API – يشبه محلل DOM وجيد للكائنات الصغيرة.
- Streaming API – إنه مشابه لـ محلل StaX وجيد للكائنات الكبيرة حيث لا ترغب في الاحتفاظ بالكائن بأكمله في الذاكرة.
بعض الواجهات المهمة لـ Java JSON API هي:
- javax.json.JsonReader: يمكننا استخدام هذا لقراءة كائن JSON أو مصفوفة إلى JsonObject. يمكننا الحصول على JsonReader من فئة Json أو JsonReaderFactory.
- javax.json.JsonWriter: يمكننا استخدام هذا لكتابة كائن JSON إلى مخرج التيار.
- javax.json.stream.JsonParser: يعمل هذا كمحلل سحب ويوفر دعمًا للبث لقراءة كائنات JSON.
- javax.json.stream.JsonGenerator: يمكننا استخدام هذا لكتابة كائن JSON إلى مصدر الإخراج بطريقة تدفقية.
- javax.json.Json: هذه هي فئة المصنع لإنشاء كائنات معالجة JSON. توفر هذه الفئة الأساليب الأكثر استخدامًا لإنشاء هذه الكائنات ومصانعها المقابلة. توفر فئات المصانع جميع الطرق المختلفة لإنشاء هذه الكائنات.
- javax.json.JsonObject: يمثل JsonObject قيمة كائن JSON لا يمكن تغييرها.
لنلقي نظرة على استخدام Java JSON API مع برنامج بسيط، لدينا كائن JSON مخزن في ملف employee.txt كما يلي؛
{
"id":123,
"name":"Pankaj Kumar",
"permanent":true,
"address":{
"street":"El Camino Real",
"city":"San Jose",
"zipcode":95014
},
"phoneNumbers":[9988664422, 1234567890],
"role":"Developer"
}
لدينا فئات فول الفاصوليا الجافة التي تمثل تنسيق JSON أعلاه كما يلي:
package com.journaldev.model;
import java.util.Arrays;
public class Employee {
private int id;
private String name;
private boolean permanent;
private Address address;
private long[] phoneNumbers;
private String role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isPermanent() {
return permanent;
}
public void setPermanent(boolean permanent) {
this.permanent = permanent;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public long[] getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(long[] phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("***** Employee Details *****\n");
sb.append("ID="+getId()+"\n");
sb.append("Name="+getName()+"\n");
sb.append("Permanent="+isPermanent()+"\n");
sb.append("Role="+getRole()+"\n");
sb.append("Phone Numbers="+Arrays.toString(getPhoneNumbers())+"\n");
sb.append("Address="+getAddress());
sb.append("\n*****************************");
return sb.toString();
}
}
package com.journaldev.model;
public class Address {
private String street;
private String city;
private int zipcode;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getZipcode() {
return zipcode;
}
public void setZipcode(int zipcode) {
this.zipcode = zipcode;
}
@Override
public String toString(){
return getStreet() + ", "+getCity()+", "+getZipcode();
}
}
I have overridden the toString() method to return human readable String representation that we will use in our JSON implementation classes.
مثال قراءة JSON في جافا
package com.journaldev.json;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonValue;
import com.journaldev.model.Address;
import com.journaldev.model.Employee;
public class EmployeeJSONReader {
public static final String JSON_FILE="employee.txt";
public static void main(String[] args) throws IOException {
InputStream fis = new FileInputStream(JSON_FILE);
// إنشاء كائن JsonReader
JsonReader jsonReader = Json.createReader(fis);
/**
* We can create JsonReader from Factory also
JsonReaderFactory factory = Json.createReaderFactory(null);
jsonReader = factory.createReader(fis);
*/
// الحصول على JsonObject من JsonReader
JsonObject jsonObject = jsonReader.readObject();
// يمكننا الآن إغلاق مصدر الإدخال و JsonReader
jsonReader.close();
fis.close();
// استرداد البيانات من JsonObject وإنشاء كائن موظف
Employee emp = new Employee();
emp.setId(jsonObject.getInt("id"));
emp.setName(jsonObject.getString("name"));
emp.setPermanent(jsonObject.getBoolean("permanent"));
emp.setRole(jsonObject.getString("role"));
// قراءة المصفوفات من json
JsonArray jsonArray = jsonObject.getJsonArray("phoneNumbers");
long[] numbers = new long[jsonArray.size()];
int index = 0;
for(JsonValue value : jsonArray){
numbers[index++] = Long.parseLong(value.toString());
}
emp.setPhoneNumbers(numbers);
// قراءة كائن داخلي من كائن json
JsonObject innerJsonObject = jsonObject.getJsonObject("address");
Address address = new Address();
address.setStreet(innerJsonObject.getString("street"));
address.setCity(innerJsonObject.getString("city"));
address.setZipcode(innerJsonObject.getInt("zipcode"));
emp.setAddress(address);
// طباعة معلومات كائن الموظف
System.out.println(emp);
}
}
التنفيذ مباشر ويشعر بالتشابه مع الحصول على المعلمات من HashMap. تنفيذ JsonReaderFactory نمط تصميم المصنع. بمجرد تنفيذ البرنامج أعلاه ، نحصل على الإخراج التالي.
***** Employee Details *****
ID=123
Name=Pankaj Kumar
Permanent=true
Role=Developer
Phone Numbers=[9988664422, 1234567890]
Address=El Camino Real, San Jose, 95014
*****************************
مثال كتابة JSON في جافا
package com.journaldev.json;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonWriter;
import com.journaldev.model.Address;
import com.journaldev.model.Employee;
public class EmployeeJSONWriter {
public static void main(String[] args) throws FileNotFoundException {
Employee emp = createEmployee();
JsonObjectBuilder empBuilder = Json.createObjectBuilder();
JsonObjectBuilder addressBuilder = Json.createObjectBuilder();
JsonArrayBuilder phoneNumBuilder = Json.createArrayBuilder();
for (long phone : emp.getPhoneNumbers()) {
phoneNumBuilder.add(phone);
}
addressBuilder.add("street", emp.getAddress().getStreet())
.add("city", emp.getAddress().getCity())
.add("zipcode", emp.getAddress().getZipcode());
empBuilder.add("id", emp.getId())
.add("name", emp.getName())
.add("permanent", emp.isPermanent())
.add("role", emp.getRole());
empBuilder.add("phoneNumbers", phoneNumBuilder);
empBuilder.add("address", addressBuilder);
JsonObject empJsonObject = empBuilder.build();
System.out.println("Employee JSON String\n"+empJsonObject);
// كتابة إلى ملف
OutputStream os = new FileOutputStream("emp.txt");
JsonWriter jsonWriter = Json.createWriter(os);
/**
* We can get JsonWriter from JsonWriterFactory also
JsonWriterFactory factory = Json.createWriterFactory(null);
jsonWriter = factory.createWriter(os);
*/
jsonWriter.writeObject(empJsonObject);
jsonWriter.close();
}
public static Employee createEmployee() {
Employee emp = new Employee();
emp.setId(100);
emp.setName("David");
emp.setPermanent(false);
emp.setPhoneNumbers(new long[] { 123456, 987654 });
emp.setRole("Manager");
Address add = new Address();
add.setCity("Bangalore");
add.setStreet("BTM 1st Stage");
add.setZipcode(560100);
emp.setAddress(add);
return emp;
}
}
عند تشغيل التطبيق أعلاه ، نحصل على الاستجابة التالية:
Employee JSON String
{"id":100,"name":"David","permanent":false,"role":"Manager","phoneNumbers":[123456,987654],"address":{"street":"BTM 1st Stage","city":"Bangalore","zipcode":560100}}
يتم أيضًا حفظ كائن JSON في ملف emp.txt. ينفذ JsonObjectBuilder نمط البناء الذي يجعل استخدامه سهلًا للغاية.
مثال على محلل JSON في جافا
محلل JsonParser في جافا هو محلل استدارة ونقرأ العنصر التالي باستخدام الطريقة next() التي تعيد كائن الحدث. javax.json.stream.JsonParser.Event
هو Enum يجعله آمنًا من النوع وسهل الاستخدام. يمكننا استخدامه في حالة التبديل لتعيين خصائص جافا الخاصة بنا.
package com.journaldev.json;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;
import com.journaldev.model.Address;
import com.journaldev.model.Employee;
public class EmployeeJSONParser {
public static final String FILE_NAME = "employee.txt";
public static void main(String[] args) throws IOException {
InputStream fis = new FileInputStream(FILE_NAME);
JsonParser jsonParser = Json.createParser(fis);
/**
* We can create JsonParser from JsonParserFactory also with below code
* JsonParserFactory factory = Json.createParserFactory(null);
* jsonParser = factory.createParser(fis);
*/
Employee emp = new Employee();
Address address = new Address();
String keyName = null;
List phoneNums = new ArrayList();
while (jsonParser.hasNext()) {
Event event = jsonParser.next();
switch (event) {
case KEY_NAME:
keyName = jsonParser.getString();
break;
case VALUE_STRING:
setStringValues(emp, address, keyName, jsonParser.getString());
break;
case VALUE_NUMBER:
setNumberValues(emp, address, keyName, jsonParser.getLong(), phoneNums);
break;
case VALUE_FALSE:
setBooleanValues(emp, address, keyName, false);
break;
case VALUE_TRUE:
setBooleanValues(emp, address, keyName, true);
break;
case VALUE_NULL:
// لا تعيد أي شيء
break;
default:
// لا نبحث عن أحداث أخرى
}
}
emp.setAddress(address);
long[] nums = new long[phoneNums.size()];
int index = 0;
for(Long l :phoneNums){
nums[index++] = l;
}
emp.setPhoneNumbers(nums);
System.out.println(emp);
// إغلاق الموارد
fis.close();
jsonParser.close();
}
private static void setNumberValues(Employee emp, Address address,
String keyName, long value, List phoneNums) {
switch(keyName){
case "zipcode":
address.setZipcode((int)value);
break;
case "id":
emp.setId((int) value);
break;
case "phoneNumbers":
phoneNums.add(value);
break;
default:
System.out.println("Unknown element with key="+keyName);
}
}
private static void setBooleanValues(Employee emp, Address address,
String key, boolean value) {
if("permanent".equals(key)){
emp.setPermanent(value);
}else{
System.out.println("Unknown element with key="+key);
}
}
private static void setStringValues(Employee emp, Address address,
String key, String value) {
switch(key){
case "name":
emp.setName(value);
break;
case "role":
emp.setRole(value);
break;
case "city":
address.setCity(value);
break;
case "street":
address.setStreet(value);
break;
default:
System.out.println("Unknown Key="+key);
}
}
}
تأتي الصعوبة الرئيسية عندما نحتاج إلى كتابة المنطق لتحليل البيانات وأحيانًا يمكن أن يصبح معقدًا. نظرًا لأننا نقرأ نفس الملف كـ JsonReader ، فإن الإخراج هو نفس برنامج EmployeeJsonReader.
مثال على مولد JSON في جافا
package com.journaldev.json;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.json.Json;
import javax.json.stream.JsonGenerator;
import com.journaldev.model.Employee;
public class EmployeeJSONGenerator {
public static void main(String[] args) throws IOException {
OutputStream fos = new FileOutputStream("emp_stream.txt");
JsonGenerator jsonGenerator = Json.createGenerator(fos);
/**
* We can get JsonGenerator from Factory class also
* JsonGeneratorFactory factory = Json.createGeneratorFactory(null);
* jsonGenerator = factory.createGenerator(fos);
*/
Employee emp = EmployeeJSONWriter.createEmployee();
jsonGenerator.writeStartObject(); // {
jsonGenerator.write("id", emp.getId()); // "id":123
jsonGenerator.write("name", emp.getName());
jsonGenerator.write("role", emp.getRole());
jsonGenerator.write("permanent", emp.isPermanent());
jsonGenerator.writeStartObject("address") //start of address object
.write("street", emp.getAddress().getStreet())
.write("city",emp.getAddress().getCity())
.write("zipcode",emp.getAddress().getZipcode())
.writeEnd(); //end of address object
jsonGenerator.writeStartArray("phoneNumbers"); //start of phone num array
for(long num : emp.getPhoneNumbers()){
jsonGenerator.write(num);
}
jsonGenerator.writeEnd(); // end of phone num array
jsonGenerator.writeEnd(); // }
jsonGenerator.close();
}
}
المولد JsonGenerator سهل للغاية في الاستخدام ويوفر أداءً جيدًا للبيانات الكبيرة. هذا كل شيء بالنسبة لـ واجهة برمجة تطبيقات جافا لمعالجة JSON. تعلمنا عن محلل Java JSON، وأمثلة القراءة والكتابة. يمكنك تنزيل مشروع جافا من الرابط أدناه واللعب به.
المراجع: JSONLint – أداة ويب رائعة للتحقق من صحة بيانات JSON تنفيذ المرجعية لمعالجة JSON صفحة JSR353 JCP
Source:
https://www.digitalocean.com/community/tutorials/java-json-example