Как использовать регулярное выражение в свойстве JSON аннотации от Джексона - PullRequest
0 голосов
/ 11 октября 2019

Можно ли использовать регулярное выражение для аннотации 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"
}

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Я не знаю, возможно ли вставить регулярное выражение в @ JsonProperty.

Но вы можете использовать @JsonAnySetter для «информационных» полей.

Map<String, Object> informations = new LinkedHashMap<>();

@JsonAnySetter
void setInformation(String key, Object value) {
    informations.put(key, value);
}

По сути, вы отображаете все поля со статическими именами:

@JsonProperty("name")
String name;

, а в информацию вы помещаете все остальные поля из json.

0 голосов
/ 13 октября 2019

Я нашел ответ через десериализацию, см. Пример ниже:

@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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...