Java sprintboot不使用setter将一个JSON字段保存为两个Java字段

Java sprintboot不使用setter将一个JSON字段保存为两个Java字段,java,Java,我正在使用sprintboot,我有一个类似于: 公共类源代码{ @NotNull @NSDash @有效标准规则 @有效标准规则 @有效标准规则 @有效标准规则 @有效标准规则 @不相容的 @不兼容雷达 @规则 @JsonDeserializer(使用=deserializer.class) 公共字符串ambian1; 公共字符串raw_ambian1; @NotNull @NSDash @有效标准规则 @有效标准规则 @有效标准规则 @不相容的 @不兼容雷达 公共字符串xebian1; 公共

我正在使用sprintboot,我有一个类似于:

公共类源代码{
@NotNull
@NSDash
@有效标准规则
@有效标准规则
@有效标准规则
@有效标准规则
@有效标准规则
@不相容的
@不兼容雷达
@规则
@JsonDeserializer(使用=deserializer.class)
公共字符串ambian1;
公共字符串raw_ambian1;
@NotNull
@NSDash
@有效标准规则
@有效标准规则
@有效标准规则
@不相容的
@不兼容雷达
公共字符串xebian1;
公共字符串raw_xebian1;
#我有100多个其他领域使用此:
}
我希望将此数据解析为固定版本,但仍保留原始版本

{“ambian1”:“a--1.1-bc.8i”,“xebian1”:“x--2.1-za.5t”,以及其他数据}
ambian1数据不能以数字开头

  • “a--1.1-bc.8i”
    将有效
  • “1a--1.1-bc.8i”
    将无效
因此,我希望我的java类被解析为:

ambian1=a--1.1-bc.8i 原始环境1=1a--1.1-bc.8i

我试图使用
@jsonaas
,但没有成功。我还试图使用
@JsonProperty
,但我得到了
错误:多个字段表示属性

公共类源代码{
@NotNull
#其他
@JsonProperty(“ambian1”);
公共字符串ambian1;
@JsonAlias(“ambian1”);
公共字符串raw_ambian1;
@NotNull
#其他
公共字符串xebian1;
#我有100多个其他领域使用此:
}

如何将json值解码为两个字段?

问题不在setters中

如果您的模型中有所有公共字段,那么您根本不应该担心多个getter/setter,因为Jackson将在序列化/反序列化时自动处理它们

但是,如果您想从单个JSON属性
“data”
中为两个字段
“fixData”
“rawData”
分配相同/相似的值,则可以为这两个字段实现一个setter,并将其标记为
@JsonProperty

可能还应该实现一个getter来获取特定属性
“数据”

如果必须隐藏空字段,则应使用
@JsonInclude
包含非空值

@JsonInclude(JsonInclude.Include.NON_NULL)
类源{
@NotNull
公共字符串数据;
@NotNull
公共字符串数据;
@JsonAlias(“另一个”)
公共字符串另一个字段;
@JsonAlias(“尚未”)
公共整数yetAnotherField;
@JsonAlias(“一个以上”)
公共场所;
@JsonProperty(“数据”)
公共void setRawData(字符串数据){
this.rawData=data;//设置为raw
this.fixData=data.replaceAll(“^(\\d+”,”“);//删除开头的数字
}
@JsonProperty(“数据”)
公共字符串getFixData(){
返回this.fixData;//获取固定的有效值
}
}
然后可以成功读取以下JSON:

String[] jsons = {
        "{\"data\":\"1abc\"}",
        "{\"data\":\"2abc\", \"another\":\"an\", \"yet\":100500, \"onemore\":3.14}",
        "{\"data\":\"3abc\", \"anotherField\":\"2VALS\"}"
};

ObjectMapper mapper = new ObjectMapper();
for (String json: jsons) {
    Source set = mapper.readValue(json, Source.class);
    System.out.printf("Setter raw: '%s', input: '%s'%n", set.rawData, set.fixData);

    String serialized = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(set);
    System.out.println("set: " + serialized);
}
输出:

Setter raw: '1abc', input: 'abc'
set: {
  "data" : "abc"
}
Setter raw: '2abc', input: 'abc'
set: {
  "anotherField" : "an",
  "yetAnotherField" : 100500,
  "oneMoreField" : 3.14,
  "data" : "abc"
}
Setter raw: '3abc', input: 'abc'
set: {
  "anotherField" : "2VALS",
  "data" : "abc"
}

“rawData”
“fixData”
将不会在JSON中进行解析。

这个问题看起来并不比它好,我该怎么办?@AlexRudenko如果有人帮助我使用我建议的setter,它会更好吗?