Rakesh
Rakesh

Reputation: 79

@jsonIgnore annotation is not working

I am using @JsonIgnore property to ignore some attributes in pojo, but these fields are not ignore in json response after parsing json using Gson library please help.

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown=true)
public class RideInvite extends RideInviteOld  implements Serializable
{
    private static final long serialVersionUID = -3729010679180341959L;


    private double newFare = -1;
    @JsonIgnore
    private long prefPickupDropId;
    @JsonIgnore
    private String pickupLandmark;
    @JsonIgnore
    private String dropLandmark;
}

using following code to parse

 GsonBuilder builder = new GsonBuilder();
        Gson gson = builder.create();
        jsonText = gson.toJson(msgObject);

Response after parsing

{"newFare":-1.0,"prefPickupDropId":2,"savePickupDropPoints":false,"pickupDropBasedOnTraffic":true,"allowFareChange":true}

here prefPickupDropId and savePickupDropPoints are json ignored but still value attribute is present in json text

I can not use @Expose for fields because my project is build in such away that ignoring fields which are not required json ignore and same pojos are using for preparing http response. This was working fine earlier but recently I am facing this issue

thanks in advance

Upvotes: 0

Views: 2486

Answers (2)

fmatar
fmatar

Reputation: 3470

You're using Jackson with GSON and those are too separate frameworks.

One of the approaches is to initialize Gson to exclude fields that do not have the expose annotation.

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

Then mark every field you need to use with the @Expose annotation:

ex:

class MyClass { @Expose public String name; }

Upvotes: 1

Pradeep
Pradeep

Reputation: 12675

Approach1:
Instead of using com.fasterxml.jackson.annotation.JsonIgnore you should use com.google.gson.annotations.Expose to achieve your requirement.

Here is working code snippet -

import java.io.Serializable;

import com.google.gson.annotations.Expose;

public class RideRecord implements Serializable {
    @Expose
    private double newFare = -1;

    private long prefPickupDropId;

    private String pickupLandmark;

    private String dropLandmark;

    public RideRecord(double newFare, long prefPickupDropId, String pickupLandmark, String dropLandmark) {
        super();
        this.newFare = newFare;
        this.prefPickupDropId = prefPickupDropId;
        this.pickupLandmark = pickupLandmark;
        this.dropLandmark = dropLandmark;
    }

}

use the following code to parse:

RideRecord msgObject = new RideRecord(-1.0, 2, "sfo", "powell bart station");
        GsonBuilder builder = new GsonBuilder();
        builder.excludeFieldsWithoutExposeAnnotation();
        Gson gson = builder.create();
        String jsonText = gson.toJson(msgObject);
        System.out.println(jsonText);

It will give output:

{"newFare":-1.0}

because only newFare is the field which is exposed. you can play with the @Expose attribute to meet your requirements.

Approach2:

If you don't want to use @Expose then also you can achieve your requirement by just creating Gson object as below -

RideRecord msgObject = new RideRecord(-1.0, 2, "sfo", "powell bart station");
        GsonBuilder builder = new GsonBuilder();
        builder.addSerializationExclusionStrategy(new ExclusionStrategy() {

            @Override
            public boolean shouldSkipField(FieldAttributes fieldAttributes) {

                return fieldAttributes.getName().equals("prefPickupDropId") || fieldAttributes.getName().equals("pickupLandmark") || fieldAttributes.getName().equals("dropLandmark");
            }

            @Override
            public boolean shouldSkipClass(Class<?> arg0) {
                // TODO Auto-generated method stub
                return false;
            }
        });

        Gson gson = builder.create();
        String jsonText = gson.toJson(msgObject);
        System.out.println(jsonText);

In this case also you will get the same output :

{"newFare":-1.0}

Upvotes: 2

Related Questions