Welkom bij de Java JSON Voorbeeld Tutorial. JSON (JavaScript Object Notation) is een op tekst gebaseerde lichte technologie voor het genereren van menselijk leesbare geformatteerde gegevens. JSON vertegenwoordigt objectgegevens in de vorm van sleutel-waardeparen. We kunnen ook geneste JSON-objecten hebben, en het biedt een eenvoudige manier om arrays voor te stellen.
Java JSON
JSON wordt veel gebruikt in webapplicaties of als serverrespons omdat het lichtgewicht is en compacter dan XML. JSON-objecten zijn eenvoudig te lezen en te schrijven, en de meeste technologieën bieden ondersteuning voor JSON-objecten. Daarom zijn JSON in Java-webdiensten zeer populair. JSR353 is uiteindelijk opgenomen in Java EE 7 en het is de Java JSON-verwerkings-API. jsonp is de referentie-implementatie voor de Java JSON Processing API. We kunnen dit gebruiken in een Maven-project door de volgende afhankelijkheid toe te voegen.
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.0.2</version>
</dependency>
Als je GlassFish 4.0 gebruikt, kun je de scope als provided houden omdat het al is opgenomen in de server. JSON API biedt twee manieren voor JSON-verwerking:
- Object Model API – Het is vergelijkbaar met DOM-parser en goed voor kleine objecten.
- Streaming API – Het is vergelijkbaar met de StaX Parser en geschikt voor grote objecten waarbij je het hele object niet in het geheugen wilt houden.
Enkele belangrijke interfaces van de Java JSON API zijn:
- javax.json.JsonReader: Hiermee kunnen we een JSON-object of een array lezen naar JsonObject. We kunnen JsonReader verkrijgen vanuit de Json-klasse of JsonReaderFactory.
- javax.json.JsonWriter: Hiermee kunnen we een JSON-object naar een uitvoerstroom schrijven.
- javax.json.stream.JsonParser: Dit werkt als een pull-parser en biedt streamingondersteuning voor het lezen van JSON-objecten.
- javax.json.stream.JsonGenerator: Hiermee kunnen we een JSON-object naar een uitvoerbron schrijven op een streaming-manier.
- javax.json.Json: Dit is de fabrieksklasse voor het maken van JSON-verwerkingsobjecten. Deze klasse biedt de meest gebruikte methoden voor het maken van deze objecten en hun bijbehorende fabrieken. De fabrieksklassen bieden allerlei manieren om deze objecten te maken.
- javax.json.JsonObject: JsonObject vertegenwoordigt een onveranderlijk JSON-objectwaarde.
Laten we kijken naar het gebruik van de Java JSON API met een eenvoudig programma. We hebben een JSON-object opgeslagen in een bestand genaamd employee.txt;
{
"id":123,
"name":"Pankaj Kumar",
"permanent":true,
"address":{
"street":"El Camino Real",
"city":"San Jose",
"zipcode":95014
},
"phoneNumbers":[9988664422, 1234567890],
"role":"Developer"
}
We hebben Java bean-klassen die het bovenstaande JSON-formaat vertegenwoordigen.
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.
Voorbeeld van Java JSON-lezen
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);
// maak JsonReader-object aan
JsonReader jsonReader = Json.createReader(fis);
/**
* We can create JsonReader from Factory also
JsonReaderFactory factory = Json.createReaderFactory(null);
jsonReader = factory.createReader(fis);
*/
// haal JsonObject op van JsonReader
JsonObject jsonObject = jsonReader.readObject();
// we kunnen nu IO-bronnen en JsonReader sluiten
jsonReader.close();
fis.close();
// Haal gegevens op uit JsonObject en maak Employee bean aan
Employee emp = new Employee();
emp.setId(jsonObject.getInt("id"));
emp.setName(jsonObject.getString("name"));
emp.setPermanent(jsonObject.getBoolean("permanent"));
emp.setRole(jsonObject.getString("role"));
// lees arrays uit 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);
// lees innerlijk object uit json-object
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);
// druk informatie over werknemersboon af
System.out.println(emp);
}
}
De implementatie is eenvoudig en voelt vergelijkbaar aan als het verkrijgen van parameters uit HashMap. JsonReaderFactory implementeert Factory Design Pattern. Wanneer we het bovenstaande programma uitvoeren, krijgen we de volgende uitvoer.
***** Employee Details *****
ID=123
Name=Pankaj Kumar
Permanent=true
Role=Developer
Phone Numbers=[9988664422, 1234567890]
Address=El Camino Real, San Jose, 95014
*****************************
Voorbeeld van Java JSON schrijven
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);
// schrijf naar bestand
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;
}
}
Wanneer we de bovenstaande toepassing uitvoeren, krijgen we het volgende antwoord:
Employee JSON String
{"id":100,"name":"David","permanent":false,"role":"Manager","phoneNumbers":[123456,987654],"address":{"street":"BTM 1st Stage","city":"Bangalore","zipcode":560100}}
JSON-object wordt ook opgeslagen in het bestand emp.txt. JsonObjectBuilder implementeert builderpatroon dat het zeer eenvoudig maakt om te gebruiken.
Voorbeeld van Java JSON-parser
Java JsonParser is een pull-parser en we lezen het volgende element met de methode next(), die een Event-object retourneert. javax.json.stream.JsonParser.Event
is een Enum die het type-veilig en gemakkelijk te gebruiken maakt. We kunnen het gebruiken in een switch-case om onze Java bean-eigenschappen in te stellen.
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:
// stel niets in
break;
default:
// we zoeken niet naar andere gebeurtenissen
}
}
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);
// sluit bronnen
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);
}
}
}
De belangrijkste complexiteit ontstaat wanneer we de logica moeten schrijven om de gegevens te parseren en soms kan dit ingewikkeld worden. Aangezien we hetzelfde bestand lezen als JsonReader, is de uitvoer hetzelfde als het programma EmployeeJsonReader.
Voorbeeld van Java JsonGenerator
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 is zeer eenvoudig te gebruiken en biedt goede prestaties voor grote gegevens. Dat is alles voor de Java JSON-verwerkings-API. We hebben geleerd over Java JSON-parser, lees- en schrijfvoorbeelden. Je kunt het Javaproject downloaden vanaf de onderstaande link en ermee spelen.
Referenties: JSONLint – Geweldige webtool om JSON-gegevens te valideren JSON Processing Referentie-implementatie JSR353 JCP-pagina
Source:
https://www.digitalocean.com/community/tutorials/java-json-example