Десериализация "развернутых" массивов Json в POJO - PullRequest
0 голосов
/ 07 июня 2019

Половина моей проблемы - не зная точных условий для поиска ответа. Я верю Я имею дело с тем, что называется "плоским" или "развернутым" массивом json с нижележащим узлом "members", так как это будет работать, если для каждого из элементов есть элемент "member:" «члены» базовых узлов свойств, но их нет.

Я получаю JSON (я не могу контролировать формат), который выглядит следующим образом:

{

  "id" : "1",

  "context" :

  {

    "id" : "123,

    "title" : "My Title"

  },

  "members": [

    {

      "prop1" : { },

      "prop2" : "123",

      "propArray1" : [ "Value1", "Value2" ],

      "prop3" : "xyz",

      "prop4" : "123"

    },

    {

      "prop1" : { },

      "prop2" : "456",

      "propArray1" : [ "Value1", "Value2" ],

      "prop3" : "abc",

      "prop4" : "456"

    }

  ] }

Мой POJO (минус простой получает / устанавливает):


@JsonAutoDetect
public class MyPojo {

    @JsonProperty
    private String id;
    @JsonProperty
    private Context context;
    @JsonProperty("members")
    private List<Member> members = new ArrayList<>();

    @JsonAutoDetect
    public class Context {
        public Context() {}

        @JsonProperty
        private String id;
        @JsonProperty
        private String title;
    }

    @JsonAutoDetect
    public class Member {

        public Member() {}

        @JsonProperty
        private String prop1;
        @JsonProperty
        private String prop2;
        @JsonProperty
        private List<String> propArray1 = new ArrayList<>();
        @JsonProperty
        private String prop3;
        @JsonProperty
        private String prop4;
        @JsonProperty
        private String prop5;

    }

    public List<Member> getMembers() {
        return members;
    }

    public void setMembers(List<Member> members) {
        this.members = members;
    }
}

Я пробовал GSON:

new Gson().fromJson(jsonEntity, MyPojo.class);

returns:
java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT

Я пробовал Джексона:

new ObjectMapper().readValue(jsonEntity, MyPojo.class);

throws:
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class MyPojo$Member]: can not instantiate from JSON object (need to add/enable type information?)
 at [Source: java.io.StringReader@5c6e5b53; line: 10, column: 3] (through reference chain: MyPojo["members"])

Я не думаю, что информация типа «добавить / включить» является релевантным предупреждением, и у меня есть конструктор по умолчанию.

Я искал десятки постов десериализации json, и этот, похоже, похож на этот, но мне нужно получить весь объект Json, а не просто его часть ... и я попытался просто извлечь массив членов, и это не так т работа.

Невозможно десериализовать JSON в POJO

1 Ответ

0 голосов
/ 11 июня 2019

здесь есть некоторые проблемы:

данные теста JSON недействительны (отсутствует закрытие "во втором идентификаторе). Исправленная версия:

{
  "id" : "1",
  "context" :
{
  "id" : "123",
  "title" : "My Title"
},
"members": [
{
  "prop1" : { },
  "prop2" : "123",
  "propArray1" : [ "Value1", "Value2" ],
  "prop3" : "xyz",
  "prop4" : "123"
},
{
  "prop1" : { },
  "prop2" : "456",
  "propArray1" : [ "Value1", "Value2" ],
  "prop3" : "abc",
  "prop4" : "456"
}
] }

вторая проблема: вложенные классы по умолчанию имеютссылка на включающий класс. Одним из следствий этого является то, что они не могут быть созданы без экземпляра включающего класса. Джексон, я получаю это исключение:

 Cannot construct instance of `foo.MyPojo$Member` (although at least one Creator exists)

исправим это путем преобразования вложенных классов в статический внутреннийклассы:

 public static class Context {
    ...
 }

третья проблема: сопоставление не соответствует JSON.

Cannot deserialize instance of `java.lang.String` out of START_OBJECT token
...
(through reference chain: foo.MyPojo["members"]->java.util.ArrayList[0]->foo.MyPojo$Member["prop1"])

исправьте это путем изменения сопоставления, например:

@JsonAutoDetect
public static class Member {

    public Member() {}

    @JsonProperty
    private Map<String, String> prop1;
    ...
}

Использованиеэти 3 изменения позволяют десериализовать JSON с помощью Джексона.

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