In below previous exaxmples. We discussed about to convert JAVA object to/ from to JSON and pretty formatting and null serailization of fields for JSON conversion. Now here we discussed about how to exclude fields/object while converting to JSON.
How to convert Java object to / from JSON by (GSON)
How to do JSON pretty formatting and Null Serialization (GSON/GsonBuilder)
GSON provide two ways to exclude fields from JSON by GsonBuilder:
- @Expose Annotation
- Custom Annotation
@Expose Annotation
By using the @Expose annotations and then using the excludeFieldsWithoutExposeAnnotation() method on the GsonBuilder will ignore all fields except the ones that have been exposed using the @Expose annotation.
Custom Annotation
By defining a custom annotation and ignoring fields that are annotated with exclusion class by extending ExclusionStrategy interface implementing that by using below GsonBuilder methods can ingnore/exclude fields from JSON.
Boolean shouldSkipField(FieldAttributes f);
public boolean shouldSkipClass(Class clazz);
Pre-Requisite:
- JAVA 8
- Maven 3
- GSON Jar as below.
GSON Dependency:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
In below example fields middleName,educationDetail and experienceDetail will not serialize because not having @Expose annotation on it and field country will also not serialize because of having @Country annotation. Here you will see how to unsearilize all these
package gsonexamples;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import model.AlbumImages;
import model.Albums;
import model.Country;
import model.Dataset;
import model.Employee;
import util.CustomExclusionStrategy;
class GsonConvertJavaObjectToJSONExclusion {
public static void main(String[] args) {
Employee employee= getJavaObject();
//CustomExclusionStrategy that will exclude the Country field.
// We also allow only those fields that have been exposed using the @Expose
//annotation
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.setExclusionStrategies(new CustomExclusionStrategy(Country.class))
.excludeFieldsWithoutExposeAnnotation()
.create();
System.out.println(gson.toJson(employee));
}
public static Employee getJavaObject()
{
Employee employee=new Employee("C123","Saurabh" ,"Kumar","Gupta","Tech Lead",50000,"Alpharetta,GA","Dallas, TX","1231231230",null,null);
return employee;
}
}
package util;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import model.Country;
import model.Dataset;
/**
* This class use custom exclusion policy. We want to ignore all fields that
* have been annotated with the Country annotation. Note that we can also ignore
* fields based on name or type. This same type policy can be applied to any * class.
*
*/
public class CustomExclusionStrategy implements ExclusionStrategy {
private Class classToExclude;
public CustomExclusionStrategy(Class classToExclude) {
this.classToExclude = classToExclude;
}
// This method is called for all fields. if the method returns false the
// field is excluded from serialization
//@Override
public boolean shouldSkipField(FieldAttributes f) {
if (f.getAnnotation(Country.class) == null)
return false;
return true;
}
// This method is called for all classes. If the method returns false the class is excluded.
//@Override
public boolean shouldSkipClass(Class<?> clazz) {
if (clazz.equals(classToExclude))
return true;
return false;
}
}
package model;
import java.util.List;
import java.util.Set;
import com.google.gson.annotations.Expose;
public class Employee {
@Expose
private String employeeId;
@Expose
private String firstName;
private String middleName;
@Expose
private String lastName;
@Expose
private String designation;
private int salary;
@Expose
private String permanentAddress;
private String mailingAddress;
@Country
private String country;
@Expose
private String mobile;
private Set<Education> educationDetail;
private List<Experience> expericeDetail;
@Override
public String toString() {
return "Employee [employeeId=" + employeeId + ", firstName=" + firstName + ", middleName=" + middleName
+ ", lastName=" + lastName + ", designation=" + designation + ", salary=" + salary
+ ", permanentAddress=" + permanentAddress + ", mailingAddress=" + mailingAddress + ", mobile=" + mobile
+ ", educationDetail=" + educationDetail + ", expericeDetail=" + expericeDetail + "]";
}
public Employee(String employeeId, String firstName, String middleName, String lastName, String designation,
int salary, String permanentAddress, String mailingAddress, String mobile, Set<Education> educationDetail,
List<Experience> expericeDetail) {
super();
this.employeeId = employeeId;
this.firstName = firstName;
this.middleName = middleName;
this.lastName = lastName;
this.designation = designation;
this.salary = salary;
this.permanentAddress = permanentAddress;
this.mailingAddress = mailingAddress;
this.mobile = mobile;
this.educationDetail = educationDetail;
this.expericeDetail = expericeDetail;
}
//Getter and setter of fields
}
package model;
public class Education {
private String schoolOrCollegeName;
private String standard;
private String stream;
private double percentage;
@Override
public String toString() {
return "Education [schoolOrCollegeName=" + schoolOrCollegeName + ", standard=" + standard + ", stream=" + stream
+ ", percentage=" + percentage + "]";
}
public Education(String schoolOrCollegeName, String standard, String stream, double percentage) {
super();
this.schoolOrCollegeName = schoolOrCollegeName;
this.standard = standard;
this.stream = stream;
this.percentage = percentage;
}
}
package model;
import java.util.Date;
public class Experience {
private String companyName;
private String designation;
private Date startDate;
private Date endDate;
private double salary;
public Experience(String companyName, String designation, Date startDate, Date endDate, double salary) {
super();
this.companyName = companyName;
this.designation = designation;
this.startDate = startDate;
this.endDate = endDate;
this.salary = salary;
}
@Override
public String toString() {
return "Experience [companyName=" + companyName + ", designation=" + designation + ", startDate=" + startDate
+ ", endDate=" + endDate + ", salary=" + salary + "]";
}
//getter and setter
}
Output
{
"employeeId": "C123",
"firstName": "Saurabh",
"lastName": "Gupta",
"designation": "Tech Lead",
"permanentAddress": "Alpharetta,GA",
"mobile": "1231231230"
}
Here in above JSON output for Employee class fields middleName, educationDetail and experienceDetail not printed because @Expose annotation was not given on that and by using CustomExlusionStartegy skiping serialization for fields country because it’s having @Country annotation as we remove in class for serialization CustomExclusionStrategy for @Country annotation.
Now in next example will discuss about.
How to parse JSON data token by token by using GSON/JsonToken/JsonReader?
Like this:
Like Loading...
You must be logged in to post a comment.