Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaSpring-在GET上忽略嵌套对象类中的空值_Java_Spring_Jackson - Fatal编程技术网

JavaSpring-在GET上忽略嵌套对象类中的空值

JavaSpring-在GET上忽略嵌套对象类中的空值,java,spring,jackson,Java,Spring,Jackson,所以,我有一点奇怪的行为。在我的Spring应用程序中,我有两个对象类,一个类嵌套在另一个类中。我正在使用Jackson将我的对象类序列化为JSON。在我的第二个对象类(ObjectB)中,我有4个字段。根据某些UI条件,我要么设置字段1和2,要么设置字段3和4,但决不能同时设置所有字段。我已经加入了Jackson注释来忽略空字段,它是有效的。在我的数据库中,提交后,我只看到字段1和2或3和4 当我从数据库获取数据时,问题就出现了。要将JSON映射到我的对象类中,我必须在解析ObjectA时设置

所以,我有一点奇怪的行为。在我的Spring应用程序中,我有两个对象类,一个类嵌套在另一个类中。我正在使用Jackson将我的对象类序列化为JSON。在我的第二个对象类(ObjectB)中,我有4个字段。根据某些UI条件,我要么设置字段1和2,要么设置字段3和4,但决不能同时设置所有字段。我已经加入了Jackson注释来忽略空字段,它是有效的。在我的数据库中,提交后,我只看到字段1和2或3和4

当我从数据库获取数据时,问题就出现了。要将JSON映射到我的对象类中,我必须在解析ObjectA时设置ObjectB类中的字段。这使我看到所有4个字段都被返回,其中一半的值显示为null。我将此信息打印到我的UI中,因此我希望通过不返回空值使其更具可读性。有什么办法可以这样做吗?我将发布一个代码示例,说明我正在尝试做什么

ObjectA.class

@JsonAutoDetect(fieldVisibility = Visibility.ANY, isGetterVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ObjectA {

   String field_A1;
   String field_A2;
   ObjectB field_A3;

   //Getters and Setters
}
@JsonAutoDetect(fieldVisibility = Visibility.ANY, isGetterVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ObjectB {

   String field_B1;
   String field_B2;
   String field_B3;
   String field_B4;

   //Getters and Setters
}
ObjectB.class

@JsonAutoDetect(fieldVisibility = Visibility.ANY, isGetterVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ObjectA {

   String field_A1;
   String field_A2;
   ObjectB field_A3;

   //Getters and Setters
}
@JsonAutoDetect(fieldVisibility = Visibility.ANY, isGetterVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ObjectB {

   String field_B1;
   String field_B2;
   String field_B3;
   String field_B4;

   //Getters and Setters
}
DB-
Object1中的数据:{field_A1:“abc”,field_A2:“def”,field_A3:{field_B1:“ghi”,field_B2:“jkl”}

类ObjectA的映射逻辑

ObjectA objA = new ObjectA();
...
ObjectB objB = new ObjectB();
if(jsonObj.get("field_B1") != null) {
    objB.setField_B1(jsonObj.get("field_B1"));
}

if(jsonObj.get("field_B2") != null) {
    objB.setField_B2(jsonObj.get("field_B2"));
}

if(jsonObj.get("field_B3") != null) {
    objB.setField_B3(jsonObj.get("field_B3"));
}

if(jsonObj.get("field_B4") != null) {
    objB.setField_B4(jsonObj.get("field_B4"));
}

objA.setField_3(objB);

返回到UI的数据-
Object1:{field\u A1:“abc”,field\u A2:“def”,field\u A3:{field\u B1:“ghi”,field\u B2:“jkl”,field\u B3:null,field\u B4:null}

我仍然不确定您使用的是哪个版本的Spring,但是从
4+
,如果我没记错的话,您可以定义一个定制的Jackson
ObjectMapper
Bean

@Bean
@Primary
public ObjectMapper customObjectMapper() {
   final ObjectMapper mapper = new ObjectMapper();
   ...
   mapper.setSerializationInclusion(Include.NON_NULL);
   return mapper;
}

使用@JsonInclude(Include.NON_NULL)作为类注释。@LppEdd我们使用的是Jackson mapper asl v.1.9.13,因此我认为我们无法访问该注释为什么不升级@user3334871@Deadpool在企业工作有局限性,哈哈。我想我可以试着看看我们是否有权升级到一个新版本,只是想知道是否有一个解决方案使用我们的版本。其次,我正在做
@JsonInclude(Include.NON_NULL)
的1.9版本。它用于发布数据,但不用于通过映射获取数据logic@user3334871顺便说一句,开发企业应用程序的时间占99%。我觉得你朋友会看看这个。我们使用的是Spring v.4.3。8@user3334871让我知道。如果您没有看到任何更改,请尝试将Bean设置为主Bean。不幸的是,我将不得不重新确定如何执行此解决方案。反序列化是可行的,但是POJO对象本身是返回的,所以无论我将返回什么空字段。我决定在我的Webapps GET call中将其作为回调函数过滤掉。因为我也在POST上序列化了,所以这些字段是否不存在并不重要。我真的很感激你的回答,我会投赞成票,因为它确实为这个问题提供了一个解决方案,尽管我不能用它来解决我的问题problem@user3334871如果你需要帮助,请打电话给我。谢谢