杰克逊·杰森(Jackson Json)

时间:2020-03-10 17:13:44

标签: java jackson

我正在尝试使用jackson @JsonProperty解析json文件。我手头有一个有趣的问题。根据输入源,标记为@JsonProperty的字段名称之一可以不同。下面的示例json文件

car1.json --> {"car": {"color": "yellow","type": "luxurySedan"}}
car2.json --> {"car": {"color": "yellow","modeltype": "SUV"}}

我的数据模型类似于

@Data
class Car {

   @JsonProperty("color")
   private String color; 

   @JsonProperty("type")
   private String type; // Don't want to use alias to solve above problem

 }

第二个文件car2.json没有被解析。我尝试对字段类型执行以下操作,以从属性文件获取值(使用Spring Boot),但它未按预期工作。我不愿意纯粹使用alias,因为如果文件的任何一个的字段名称更改,我将不得不更改代码。有人可以帮忙吗

@JsonProperty(@Value("${car.type}")) // Compilation error (It's a spring boot project)
@JsonProperty("${car.type}") // Values not read

1 个答案:

答案 0 :(得分:0)

您的JSON似乎没有car节点,因此您不能将其用作@JsonProperty批注的一部分。一般而言,您只需要指定单个节点名称,而不是完整路径,因为它们是相对于根节点进行评估的。在您嵌套JSON结构的地方,通常将它们封装在单独的类中,因此您仍然不需要放入完整路径。

class Car {

    @JsonProperty("color")
    private String color;

    @JsonProperty("type")
    private String type;

    @JsonProperty("modeltype")
    private String modelType;

    // The rest of the class
}

应对您提供的JSON有用。如果源JSON中缺少属性,则其值将只是Java对象中的null

您的第二个JSON示例失败,因为杰克逊试图将JSON解组的Java对象未声明名为"modeltype"的属性,并且默认行为是对未知属性失败。可以通过添加以下类级别的注释来抑制该特定行为:

@JsonIgnoreProperties(ignoreUnknown = true)

但是,这将导致Jackson完全忽略没有映射字段的任何属性,因此您将丢失与未知属性相关的任何数据。

相关问题