我有一个Java类,我想使用jackson将它序列化为CSV。此外,我想从csv中排除一个基于外部属性的单个字段。
我已经尝试在我的数据类csvMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
上使用jackson提供的所有功能,如Feature.IGNORE_UNKNOWN=true
或@JsonIgnoreProperties(ignoreUnknown = true)
,但都不起作用。当不是所有列都在架构中声明时,我仍然会收到在架构中找不到的异常列。代码在其他情况下运行良好。
在这里我上传我的实现
public class MyClass{
@JsonProperty("A")
private string a;
@JsonProperty("B")
private string b;
@JsonProperty("C")
private string c;
}
CsvMapper mapper = new CsvMapper();
mapper.configure(Feature.IGNORE_UNKNOWN, true);
CsvSchema csvSchema;
if (disable = true) {
schema = CsvSchema.builder()
.addColumn("A")
.addColumn("C")
.build()
} else {
schema = CsvSchema.builder()
.addColumn("A")
.addColumn("B")
.addColumn("C")
.build()
}
ObjectWriter ow = mapper.writer(schema);
String csv = ow.writeValueAsString(list);
在属性顶部使用@JsonIgnore。例如:
import com.fasterxml.jackson.annotation.JsonIgnore;
@Validated
@Data
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
public class MyResponseModel {
...
@JsonIgnore
private String createBy;
...
}
当您想将JSON反序列化到Java类中时,使用Feature.IGNORE_UNKNOWN=true
或@JsonIgnoreProperties(ignoreUnknown = true)
会有所帮助。
例如,当您实现REST API时,这将非常有用,并且在专门用于创建新对象的POST方法中,您希望忽略用户发送给您的所有无效/不正确字段,只处理有效字段,而不是返回400/500错误。
在您的情况下,只需要将@JsonIgnore
注释放在Java类中的字段上,您希望在序列化过程中排除该字段。这是一个排除«a»属性的示例:
public class MyClass {
@JsonIgnore
@JsonProperty("A")
private String a;
@JsonProperty("B")
private String b;
@JsonProperty("C")
private String c;
}
当您想从应用程序日志中排除一些私人和敏感信息时,这也应该很有用,比如密码、PII、PHI等。
更新:
这是适用于您的案例的有效解决方案:
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MyClass {
@JsonProperty("A")
private String a;
@JsonProperty("B")
private String b;
@JsonProperty("C")
private String c;
}
public String test() throws JsonProcessingException {
boolean disable = false;
CsvMapper mapper = new CsvMapper();
mapper.configure(JsonGenerator.Feature.IGNORE_UNKNOWN, true);
CsvSchema csvSchema;
List<MyClass> list = List.of(MyClass.builder()
.a("a1")
.b("b1")
.c("c1")
.build()
);
if (disable) {
csvSchema = CsvSchema.builder()
.addColumn("A")
.addColumn("C")
.build();
} else {
csvSchema = CsvSchema.builder()
.addColumn("A")
.addColumn("B")
.addColumn("C")
.build();
}
ObjectWriter ow = mapper.writer(csvSchema);
String csv = ow.writeValueAsString(list);
return csv;
}
依赖性,我一直在使用它来测试和验证上面的代码:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-csv</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>