Jackson在创建JSON时跳过字段



我有一个类似的类

public class MyPojo {
String name,
String age
String sub
}

和一样的地图

地图("姓名":"约翰","年龄":21(

使用JacksonsObjectMapper,我得到一个类似的字符串

{
"name": "john",
"age": "21",
"sub": null
}

但我想排除sub:

{
"name": "john",
"age": "21"
}

我怎样才能做到这一点并告诉Jackson跳过sub

p.S.请记住,我希望能够在不更改POJO类的情况下排除age并包括sub,因此@JsonIgnore不太适合。

您可以在POJO类中使用java.util.Optional。您可以将Map转换为POJO,然后忽略null-s对其进行串行化。CCD_ 12允许区分CCD_ 13与根本不设置CCD_。参见以下示例:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
public class DateApp {
private final static JsonMapper JSON_MAPPER = JsonMapper.builder()
.enable(SerializationFeature.INDENT_OUTPUT)
.addModule(new Jdk8Module())
.build();
public static void main(String[] args) throws Exception {
Map<String, Object> map = new HashMap<>();
map.put("name", "John");
map.put("age", 21);
MyPojo pojo = JSON_MAPPER.convertValue(map, MyPojo.class);
System.out.println(pojo);
System.out.println("JSON:");
JSON_MAPPER.writeValue(System.out, pojo);
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
class MyPojo {
private Optional<String> name;
private Optional<String> age;
private Optional<String> sub;
}

以上代码打印:

MyPojo(name=Optional[John], age=Optional[21], sub=null)
JSON:
{
"name" : "John",
"age" : "21"
}

您可以尝试这种方法,以避免最终json中的null属性

我使用了ObjectMapper对象,将下面的属性设置为避免json中的null属性

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

代码如下:

MyPojo.java

public class MyPojo {
private String name;
private String age;
private String sub;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSub() {
return sub;
}
public void setSub(String sub) {
this.sub = sub;
}
@Override
public String toString() {
return "MyPojo{" +
"name=" + name +
", age=" + age +
", sub=" + sub +
'}';
}
}

Test.java

public class Test {
public static void main(String[] args) throws JsonProcessingException {
Map<String,String> inputMap = new HashMap<>();
inputMap.put("age","21");
inputMap.put("name","John");
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
MyPojo p = mapper.convertValue(inputMap,MyPojo.class);

System.out.println(p);
System.out.println(mapper.writeValueAsString(p));
}

}

输出:

MyPojo{name=John, age=21, sub=null}
{"name":"John","age":"21"}

您可以创建自定义序列化程序。

只需在序列化程序代码中包含映射

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonSerialize(using = MyPojoSerializer.class)
public class MyPojo {
String name;
String age;
String sub;
}
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class MyPojoSerializer extends JsonSerializer<MyPojo> {
@Override
public void serialize(MyPojo myPojo, JsonGenerator jGen, SerializerProvider serializerProvider) throws IOException {
jGen.writeStartObject();
// Map map = ....
for (final Field field : myPojo.getClass().getDeclaredFields()) {
ReflectionUtils.makeAccessible(field);
final String fieldName = field.getName();
final Object fieldValue = ReflectionUtils.getField(field, myPojo);
if (map.containsKey(fieldName)) {
jGen.writeFieldName(fieldName);
jGen.writeObject(fieldValue);
}
}
jGen.writeEndObject();
}
}

最新更新