Джексон десериализует список строк в строку - PullRequest
0 голосов
/ 04 февраля 2020

Есть ли простой способ десериализации списка строк в одну строку?

Например, у меня было бы это JSON:

{
    "stringList": [
        "somethingElse"
    ],
    "simpleString": "something",
}

Я бы хотел, чтобы быть десериализованным в этот POJO:

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class AClass {

    @JsonProperty("stringList")
    private String justAString;

    @JsonProperty("simpleString")
    private String someString;
}

Я хотел бы отметить, что несомненно, что список имеет только один элемент и не имеет никакого контроля над тем, как он генерируется. Является ли единственный способ go настраиваемым десериализатором для поля justAString ?

EDIT Я хотел бы использовать класс ObjectMapper от Джексона если это возможно

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Одним из способов является использование альтернативных методов получения / установки для свойства, которое требует преобразования, т.е. перемещение аннотаций @JsonProperty из полей в методы получения, добавление дополнительного набора методов получения / установки и использование @JsonIgnore поэтому ObjectMapper не использует их:

class AClass {

    private String justAString;
    private String someString;

    @JsonProperty // JSON field named same as virtual property
    private List<String> getStringList() { // Getter for virtual property (private = hidden from Java callers)
        return Collections.singletonList(this.justAString);
    }

    private void setStringList(List<String> stringList) { // Setter for virtual property
        this.justAString = stringList.toString();
    }

    @JsonIgnore // This POJO property is not a JSON field
    public String getJustAString() { // Standard POJO getter
        return this.justAString;
    }

    public void setJustAString(String justAString) { // Standard POJO setter
        this.justAString = justAString;
    }

    @JsonProperty("simpleString") // JSON field named different from POJO property
    public String getSomeString() { // Standard POJO getter
        return this.someString;
    }

    public void setSomeString(String someString) { // Standard POJO setter
        this.someString = someString;
    }

}

Тест

String input = "{\r\n" + 
               "    \"stringList\": [\r\n" + 
               "        \"somethingElse\"\r\n" + 
               "    ],\r\n" + 
               "    \"simpleString\": \"something\"\r\n" + 
               "}";
AClass aClass = new ObjectMapper().readValue(input, AClass.class);
System.out.println("justAString = " + aClass.getJustAString());
System.out.println("someString = " + aClass.getSomeString());

Выход

justAString = [somethingElse]
someString = something
0 голосов
/ 04 февраля 2020

это:

@JsonProperty("stringList")
private String justAString;

должен быть список строк, вы не думаете ??

@JsonProperty("stringList")
private List<String> justAString;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...