【问题标题】: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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-18
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多