Свойство Джексона json (строка) для экземпляра - PullRequest
0 голосов
/ 16 мая 2019

Предполагая, что у меня есть следующий JSON:

{
  "property": "123:1234"
}

Как использовать аннотации Джексона, чтобы гарантировать, что строковое значение "property" десериализовано в самоопределяемый класс, а не в объект String? Я просмотрел их документацию и не смог найти эту особенность.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Вы можете создать собственный десериализатор для своего поля. Предполагая, что вы хотите отобразить его на SomeClass объект:

public class SomeClass {

    @JsonDeserialize(using = CustomPropertyDeserializer.class)
    private Properties property;

    public Properties getProperty() {
        return property;
    }

    public void setProperty(Properties property) {
        this.property = property;
    }
}

Вы аннотируете свое поле, которое хотите десериализовать, с помощью @JsonDeserialize аннотации, передавая пользовательский десериализатор. Ваш десериализатор может выглядеть так:

public class CustomPropertyDeserializer extends StdDeserializer<Properties> {

    public CustomPropertyDeserializer() {
        super(Properties.class);
    }

    @Override
    public Properties deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        String valueAsString = p.getValueAsString();
        String[] split = valueAsString.split(":");

        return new Properties(split[0], split[1]);
    }
}

И класс пользовательских свойств:

public class Properties {
    private String first;
    private String second;

    public Properties(String first, String second) {
        this.first = first;
        this.second = second;
    }

    public String getFirst() {
        return first;
    }

    public void setFirst(String first) {
        this.first = first;
    }

    public String getSecond() {
        return second;
    }

    public void setSecond(String second) {
        this.second = second;
    }
}

Для тестирования это:

    public static void main(String[] args) throws IOException {
        String s = Files.lines(Paths.get("src/main/resources/data.json")).collect(Collectors.joining());

        ObjectMapper objectMapper = new ObjectMapper();

        SomeClass someClass = objectMapper.readValue(s, SomeClass.class);

        System.out.println(someClass.getProperty().getFirst());
        System.out.println(someClass.getProperty().getSecond());

    }

Тогда вывод будет:

123
1234

Таким образом, вся пользовательская логика сопоставления вашей String с некоторым определенным вами классом может быть помещена в deserialize метод вашего пользовательского десериализатора.

0 голосов
/ 16 мая 2019

Первым делом определите ваш класс, который нужно использовать:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class JsonTest{
@JsonProperty("property")
private String property;

    //define your getters and setters for the field

Тогда вы можете использовать класс ObjectMapper от Джексона:

  public static <T> T extractObjectFromJson(String jsonText, Class<T> type) {
    try {
        return new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).reader().forType(type)
                .readValue(jsonText);
    } catch (Exception e) {
        //Manage your exception here
    }
    return null;
}

Так что вы можете просто вызвать метод extractobjectFromJson(//Your JSON String, JsonTest.class), чтобы десериализовать ваш JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...