Java @jsonIgnore批注不起作用

Java @jsonIgnore批注不起作用,java,json,pojo,Java,Json,Pojo,我正在使用@JsonIgnore属性忽略pojo中的一些属性,但在使用Gson库解析json后,json响应中不会忽略这些字段。请帮助 import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown=true) public class RideInvite e

我正在使用
@JsonIgnore
属性忽略pojo中的一些属性,但在使用Gson库解析json后,json响应中不会忽略这些字段。请帮助

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;
}
使用以下代码来解析

 GsonBuilder builder = new GsonBuilder();
        Gson gson = builder.create();
        jsonText = gson.toJson(msgObject);
解析后的响应

{"newFare":-1.0,"prefPickupDropId":2,"savePickupDropPoints":false,"pickupDropBasedOnTraffic":true,"allowFareChange":true}
此处,prefPickupDropId和savePickupDropPoints被json忽略,但json文本中存在still value属性

我不能使用@Expose for fields,因为我的项目构建得太远了,以至于忽略了不需要的字段,json忽略了这些字段,而相同的POJO正用于准备http响应。这是工作良好,但最近我面临着这个问题


提前感谢

方法1:
不要使用
com.fasterxml.jackson.annotation.JsonIgnore
以达到您的要求

以下是工作代码片段-

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;
    }

}
使用以下代码进行分析:

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);
它将提供以下输出:

{“新票价”:-1.0}

因为只有
newFare
是公开的字段。 您可以使用
@Expose
属性来满足您的需求

方法2:

如果您不想使用
@Expose
,那么您也可以实现 只需创建
Gson
对象即可满足需求,如下所示-

RideRecord msgObject=新的RideRecord(-1.0,2,“sfo”,“鲍威尔巴特站”);
GsonBuilder=新的GsonBuilder();
builder.addSerializationExclutionStrategy(新的ExclutionStrategy()){
@凌驾
公共布尔值shouldSkipField(FieldAttributes FieldAttributes){
返回fieldAttributes.getName().equals(“prefPickupDropId”)| | fieldAttributes.getName().equals(“pickupLandmark”)| | fieldAttributes.getName().equals(“dropLandmark”);
}
@凌驾
公共布尔值shouldSkipClass(类arg0){
//TODO自动生成的方法存根
返回false;
}
});
Gson Gson=builder.create();
字符串jsonText=gson.toJson(msgObject);
System.out.println(jsonText);
在这种情况下,您也将获得相同的输出:

{“新票价”:-1.0}


方法1:
不要使用
com.fasterxml.jackson.annotation.JsonIgnore
以达到您的要求

以下是工作代码片段-

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;
    }

}
使用以下代码进行分析:

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);
它将提供以下输出:

{“新票价”:-1.0}

因为只有
newFare
是公开的字段。 您可以使用
@Expose
属性来满足您的需求

方法2:

如果您不想使用
@Expose
,那么您也可以实现 只需创建
Gson
对象即可满足需求,如下所示-

RideRecord msgObject=新的RideRecord(-1.0,2,“sfo”,“鲍威尔巴特站”);
GsonBuilder=新的GsonBuilder();
builder.addSerializationExclutionStrategy(新的ExclutionStrategy()){
@凌驾
公共布尔值shouldSkipField(FieldAttributes FieldAttributes){
返回fieldAttributes.getName().equals(“prefPickupDropId”)| | fieldAttributes.getName().equals(“pickupLandmark”)| | fieldAttributes.getName().equals(“dropLandmark”);
}
@凌驾
公共布尔值shouldSkipClass(类arg0){
//TODO自动生成的方法存根
返回false;
}
});
Gson Gson=builder.create();
字符串jsonText=gson.toJson(msgObject);
System.out.println(jsonText);
在这种情况下,您也将获得相同的输出:

{“新票价”:-1.0}


你把Jackson和GSON一起使用,这些框架太独立了

其中一种方法是初始化Gson以排除没有expose注释的字段

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

然后标记需要与
@Expose
注释一起使用的每个字段:

例:


类MyClass{
@公开公共字符串名称;

}

您将Jackson与GSON一起使用,这些框架太独立了

其中一种方法是初始化Gson以排除没有expose注释的字段

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

然后标记需要与
@Expose
注释一起使用的每个字段:

例:


类MyClass{
@公开公共字符串名称;

}

如果用户回答了您的问题,则可能会重复,请同时接受他的回答。如果没有,请说明还有什么问题没有回答,这是StackOverflow的一个非常关键的部分,非常感谢。如果用户回答了您的问题,请也接受他的回答。如果没有比请指定什么仍然没有回答,这是一个真正的StackOverflow的关键部分,非常感谢你,但在我的项目中,我不能使用这个,因为1。我无法将我的所有pojo更改为@Expose,并且需要对http响应使用相同的pojo。这也在前面工作过,您能帮助我使用json忽略任何依赖项吗etc@Rakesh,你能像下面那样使用瞬态吗-?私人双新票价=-1;私有瞬态长预取dropid;私有瞬态字符串pickupLandmark;私有瞬态字符串标记;在这种情况下,您也可以得到预期的结果。@Rakesh,我的答案符合您的要求吗?@Rakesh,如果您在使用
transient
时有任何限制,那么您可以尝试上面在方法2中解释的简单解决方案,但在我的项目中,我不能使用它,因为1。我无法将我的所有pojo更改为@Expose,并且需要对http响应使用相同的pojo。这也在前面工作过,您能帮助我使用json忽略任何依赖项吗etc@Rakesh,可以吗