Создание класса отображения для Json Array - PullRequest
1 голос
/ 02 апреля 2019

указано ниже файла Json

[
  "a",
  "b",
  "c"
]

Мне нужно создать класс POJO для вышеупомянутого Json. Я попробовал ниже код

public class Elements{
  public String element;
  public Elements(String element){
    this.element = element;
  }
}

.........

public class OuterElement{
   Elements[] elements;
   //Getter and Setter
}

Но я получаю ниже исключения

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of [...] out of START_ARRAY token

Каким должен быть класс POJO в этом случае?

Ответы [ 4 ]

1 голос
/ 02 апреля 2019

Вы можете использовать массив или список:

["a","b","c"] -> элементы String [];

["a","b","c"] -> элементы списка;

{"elements":["a","b","c"]} -> class YourPOJO {String[] elements;}

И помните, что вам нужны геттеры, сеттеры и конструктор по умолчанию

0 голосов
/ 02 апреля 2019

Вы можете использовать http://www.jsonschema2pojo.org/ для анализа вашего JSON в POJO

Обратите внимание, что если ваш полный JSON равен

["a","b","c"] Это может быть проанализировано только как массив списка. Вместо того, чтобы сопоставить его с объектом, попробуйте получить доступ к JSON по-другому. Смотрите пример @ jschnasse answer .

Но, если у вас обычно есть объект JSON как

{
  "alphabet": ["a","b","c"]
}

затем http://www.jsonschema2pojo.org/ сгенерирует вам следующее POJO:

package com.example;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "alphabet"
})
public class Example {

    @JsonProperty("alphabet")
    private List<String> alphabet = null;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("alphabet")
    public List<String> getAlphabet() {
        return alphabet;
    }

    @JsonProperty("alphabet")
    public void setAlphabet(List<String> alphabet) {
        this.alphabet = alphabet;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}
0 голосов
/ 02 апреля 2019

С вашим pojo мы получим данные, как показано ниже,

Java-код

OuterElement outerElement=new OuterElement();
        outerElement.setElements(new Elements[]{new Elements("a"),new Elements("b"),new Elements("c")});

А данные

{
    "elements": [
        {
            "element": "a"
        },
        {
            "element": "b"
        },
        {
            "element": "c"
        }
    ]
}

, поэтому json mapper не удалось преобразовать, ожидал преобразователь данных - это объект, но вы отправили массив, который произвел "Can not deserialize instance of [...] out of START_ARRAY token"

вы можете иметь pojo, как показано ниже,

public class Elements {

    @JsonProperty("0")
    public String element;

    public String getElement() {
        return element;
    }

    public void setElement(String element) {
        this.element = element;
    }

    public Elements(String element) {
        super();
        this.element = element;
    }



}
0 голосов
/ 02 апреля 2019

Вам нужно создать конструктор, который принимает параметр List<String> и аннотировать его с помощью @JsonCreator.Простой пример ниже:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;

public class Test {

    public static void main(String[] args) throws Exception {
        String json = "[\"a\",\"b\",\"c\"]";

        ObjectMapper mapper = new ObjectMapper();
        OuterElement outerElement = mapper.readValue(json, OuterElement.class);

        System.out.println(outerElement);
    }
}

class Element {

    private String value;

    public Element(String value) {
        this.value = value;
    }

    // getters, setters, toString
}

class OuterElement {

    private Element[] elements;

    @JsonCreator
    public OuterElement(List<String> elements) {
        this.elements = new Element[elements.size()];
        int index = 0;
        for (String element : elements) {
            this.elements[index++] = new Element(element);
        }
    }

    // getters, setters, toString
}

Над кодом напечатаны:

OuterElement{elements=[Element{value='a'}, Element{value='b'}, Element{value='c'}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...