@jsonIgnore注释不起作用

时间:2018-06-08 12:09:49

标签: 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 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文本中仍然存在值属性

我不能将@Expose用于字段,因为我的项目是在这样的地方构建的,忽略了json忽略的字段和相同的pojos用于准备http响应。这工作得很好,但最近我面临这个问题

提前致谢

2 个答案:

答案 0 :(得分:1)

<强> Approach1:
您应该使用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); com.google.gson.annotations.Expose以达到您的要求。

以下是工作代码段 -

newFare

使用以下代码进行解析:

@Expose

它会输出:

  

{ “newFare”: - 1.0}

因为只有@Expose是暴露的字段。 您可以使用Gson属性来满足您的要求。

方法2:

  

如果您不想使用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); ,那么您也可以实现自己的目标   只需创建int main() { for(int i=0;i<100;i++) { void my_func(){ cout<<"Hello! Brother"<<endl; } } } 对象,如下所示 -

 Unity                    - 2018.1.2f1
 ResonanceAudioForUnity   -  1.2.1
 SteamVR plugin for Unity - v1.2.3

在这种情况下,您也会获得相同的输出:

  

{ “newFare”: - 1.0}

答案 1 :(得分:0)

你正在将杰克逊与GSON结合使用,而这些框架太过独立。

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

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

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

例如:

class MyClass { @Expose public String name; }