【问题标题】:How to use regular expression in the annotation JSON property from jackson如何在杰克逊的注释 JSON 属性中使用正则表达式
【发布时间】:2020-02-08 23:27:11
【问题描述】:
jsonproperty注解可以使用正则表达式吗?是怎么做的?
我有来自第三方的 json 前缀属性如下:
{
"1. information": "testing"
"2. information": "testing 2"
}
我希望所有信息都附加到列表数组信息中,请参见下面的伪示例:
public class TimeSeries {
@JsonProperty(/.*information/g)
private List<String> information;
}
有时某些字符串属性也是带有日期的后缀,这是可能的,但除此之外还有唯一的名称。可以在这里使用正则表达式吗?
{
"Price 2019-09-01": "testing"
"Quantity 2019-09-01": "testing 2"
}
【问题讨论】:
标签:
java
spring-boot
jackson
【解决方案1】:
我不知道是否可以将正则表达式放入@JsonProperty。
但是您可以将@JsonAnySetter 用于“信息”字段。
Map<String, Object> informations = new LinkedHashMap<>();
@JsonAnySetter
void setInformation(String key, Object value) {
informations.put(key, value);
}
基本上,您映射所有具有静态名称的字段:
@JsonProperty("name")
String name;
在信息中,您将所有其他字段都放在 json 中。
【解决方案2】:
我通过反序列化找到了答案,见下例:
@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@Setter
@NoArgsConstructor
public class TimeSeries {
@JsonProperty("Meta Data")
private MetaData metaData;
@JsonDeserialize(using = MetaDataDeserializer.class)
@Getter
@Setter
@NoArgsConstructor
static class MetaData {
private String information;
private String symbol;
}
private static class MetaDataDeserializer extends StdDeserializer<MetaData> {
protected MetaDataDeserializer() {
super(MetaData.class);
}
@Override
public MetaData deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException {
MetaData metaData = new MetaData();
while (!parser.isClosed()) {
JsonToken jsonToken = parser.nextToken();
if (JsonToken.FIELD_NAME.equals(jsonToken)) {
String fieldName = parser.getCurrentName();
System.out.println(fieldName);
//jsonToken =
parser.nextToken();
if (fieldName.toLowerCase().matches(".*information")) {
metaData.setInformation(parser.getValueAsString());
}
}
}
return metaData;
}
}
}