如何在杰克逊的注释 JSON 属性中使用正则表达式



是否可以对jsonproperty注释使用正则表达式以及如何完成?

我有来自第三方的 json,他们前缀属性如下:

{ 
"1. information": "testing"
"2. information": "testing 2"
}

我希望所有信息都附加到列表数组信息中,请参阅下面的伪示例:

public class TimeSeries {
@JsonProperty(/.*information/g)
private List<String> information;
}

有时,某些 String 属性也是带有日期的后缀,这是可能的,但除此之外还有唯一的名称。这里可以使用正则表达式吗?

{ 
"Price 2019-09-01": "testing"
"Quantity 2019-09-01": "testing 2"
}

我不知道是否可以将正则表达式放入@JsonProperty。

但是您可以将@JsonAnySetter用于"信息"字段。

Map<String, Object> informations = new LinkedHashMap<>();
@JsonAnySetter
void setInformation(String key, Object value) {
informations.put(key, value);
}

基本上,您映射所有具有静态名称的字段:

@JsonProperty("name")
String name;

在信息中,您将 JSON 中的所有其他字段放在一起。

我通过反序列化找到了答案,请参见以下示例:

@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;
}
}
}

最新更新