【问题标题】:Java parsing one JSON field to two Java fields without settersJava 将一个 JSON 字段解析为两个 Java 字段而无需设置器
【发布时间】:2021-01-18 08:34:36
【问题描述】:

我正在使用 sprintboot,我的模型如下:

public class Source {

    # I have 10 annotation here validator
    # @NotNull @Deserializer and other
    public String raw_data;

    # I have 10 annotation here validator
    # @NotNull @Deserializer and other
    public String fix_data;  

    # i have more than 100+ other field
}

我想将这些数据解析成固定版本,但仍保留原始原始版本。

{"data":"somedata"}

数据不能以数字开头。

  • "abc" 有效
  • "1abc" 无效

所以我希望我的 java 类被解析为:

public class Source {
    public String raw_data = "1abc";
    public String fix_data = "abc";
}

我尝试使用@JsonAlias,但没有成功。我也尝试使用@JsonProperty,但我得到了error: Multiple fields representing property

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

【问题讨论】:

标签: java json spring-boot


【解决方案1】:

映射数据 -> raw_data 并在您的方法中:

setRawData(String rawData){
  this.rawData = rawData;
  this.fixedData = rawData.replace("1", ""); // Whatever you do to fix it
}

【讨论】:

  • 没有 setter 怎么办?
  • 为什么不使用setter?
  • 我使用其他 @ 对象的东西,当我使用设置器时,我的模型不起作用
  • 我也使用不同的类型,比如字段的数字和类
  • 你的例子有2个字符串,没有注释也没有清晰的例子
【解决方案2】:

您可以使用 @JsonCreator 应用于构造函数来反序列化提到的 JSON 结构。

public class Source {

    public String rawData;
    public String fixdata;

    @JsonCreator
    public Source(@JsonProperty("data") String data) {
        this.rawData = data;
        this.fixData = data.replaceAll("^(\\d+)", ""); // removing digits at the start
    }
}

测试

String json = "{\"data\":\"1abc\"}";
ObjectMapper mapper = new ObjectMapper();
Source src = mapper.readValue(json, Source.class);
System.out.printf("raw: '%s', input: '%s'%n", src.rawData, src.fixData);

输出:

raw: '1abc', input: 'abc'

【讨论】:

  • 如果我有多个值怎么办?
  • 哪个多个值?
  • 所以你只需将其他值添加到构造函数并在那里设置。
  • 我有 1 个具有 100 多个属性的模型
  • 您发布了一个范围狭窄的问题。在初始上下文中,您得到了对该问题的有效“复制粘贴就绪”答案。而不是说“谢谢”,你开始记住你实际上下文的细节,甚至可能意识到你的实际问题完全不同。就像,一个模型中有 100 多个属性是相当大的气味。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多