Introduction
GSON is an open source Java API for serializing and deserializing JSON objects from and to Java objects, developed by Google. The purpose of this article is to provide a simple example of how to use this library.
Using the Code
GSON API could be found at maven repository. You can add the following section in your pom.xml in order to download gson.jar.
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.7</version>
</dependency>
For this example, we need a remote storage for our JSON objects. There is a free online tool for JSON response mocking http://www.json-gen.com/.
We created a simple Employee
JSON object with the following structure:
{
"id": 149859,
"first_name": "Mike",
"last_name": "Gonzalez",
"date": "11/23/2016, 9:11:04 PM",
"photo": "http://srcimg.com/100/150",
"married": true
}
This JSON structure can be accessed via the following link:
We also need a class that will represent our Employee
JSON object:
public class Employee {
private int id;
private String firstName;
private String lastName;
private Date date;
private String photo;
private boolean married;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy, hh:mm:ss a", Locale.ENGLISH);
builder.append("Id: ").append(id).append(", ")
.append("First Name: ").append(firstName).append(", ")
.append("Last Name: ").append(lastName).append(", ")
.append("Date: ").append(sdf.format(date)).append(", ")
.append("Photo path: ").append(photo).append(", ")
.append("Is Married: ").append(married);
return builder.toString();
}
}
As we can see, naming conventions for JSON object and Java object are not the same, so we cannot use default GSON deserializer. For that purpose, we need to create a new class that will implement our logic for deserializing.
public class JsonDeserializerEmployee implements JsonDeserializer<Employee>{
public Employee deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
JsonObject employeeJson = json.getAsJsonObject();
int id = employeeJson.get("id").getAsInt();
String firstName = employeeJson.get("first_name").getAsString();
String lastName = employeeJson.get("last_name").getAsString();
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy, hh:mm:ss a", Locale.ENGLISH);
date = sdf.parse(employeeJson.get("date").getAsString() );
} catch (ParseException e) {
e.printStackTrace();
}
String photoPath = employeeJson.get("photo").getAsString();
boolean married =employeeJson.get("married").getAsBoolean();
Employee employee = new Employee();
employee.setId(id);
employee.setFirstName(firstName);
employee.setLastName(lastName);
employee.setDate(date);
employee.setPhoto(photoPath);
employee.setMarried(married);
return employee;
}
}
And finally, code for the main
class:
public static void main(String[] args) throws IOException {
String url = "http://json-gen.com/rest/service/get/otg3pqViiK13sxL1Zua2uSH";
String content = fetchContent(url);
Gson gson = new GsonBuilder().registerTypeAdapter(Employee.class, new JsonDeserializerEmployee())
.serializeNulls().create();
Employee employee = gson.fromJson(content, new TypeToken<Employee>(){}.getType());
System.out.println(employee);
}
private static String fetchContent(String uri) throws IOException {
final int OK = 200;
URL url = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
int responseCode = connection.getResponseCode();
if(responseCode == OK){
BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
}
return null;
}