我正在尝试使用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
答案 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完全忽略没有映射字段的任何属性,因此您将丢失与未知属性相关的任何数据。