我使用@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响应。这工作得很好,但最近我面临这个问题
提前致谢
答案 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;
}