Десериализовать строки и объекты, используя аннотации Джексона в Java - PullRequest
1 голос
/ 10 мая 2019

Мой текущий файл json выглядит следующим образом:

{
  "root": {
    "node1a":[
    ],
    "node1b":[
      "foo",
      "bar"
    ]
  }
}

И десериализация Джексона:

@JsonCreator
class DeserializationClass{

    Map<String, List<String>> nodes;

    DeserializationClass(@JsonProperty("root") final Map<String, List<String>> nodes) {
        this.nodes = nodes;
    }
}

Однако я хочу перейти к такой структуре, как

{
  "root": {
    "node1a":[
    ],
    "node1b":[
      "foo",
      "bar",
      {
        "key1":"value",
        "key2":"value"
      }
    ]
  }
}

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

Map<String, List<String>> 

на

Map<String, List<AnotherClass>>?

Ответы [ 2 ]

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

Вы можете использовать JsonCreator аннотацию и два конструктора для элемента POJO. Если в массиве есть примитив, то будет использован конструктор 1-arg. В случае полностью установленного объекта будет использоваться 2-arg конструктор. Посмотрите на приведенный ниже пример:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.List;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.readValue(jsonFile, DeserializationClass.class));
    }
}


class DeserializationClass {

    Map<String, List<AnotherClass>> nodes;

    @JsonCreator
    DeserializationClass(@JsonProperty("root") final Map<String, List<AnotherClass>> nodes) {
        this.nodes = nodes;
    }

    @Override
    public String toString() {
        return "DeserializationClass{" +
                "nodes=" + nodes +
                '}';
    }
}

class AnotherClass {

    private String key1;
    private String key2;

    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public AnotherClass(@JsonProperty("key1") String value) {
        this(value, null);
    }

    @JsonCreator
    public AnotherClass(@JsonProperty("key1") String key1, @JsonProperty("key2") String key2) {
        this.key1 = key1;
        this.key2 = key2;
    }

    @Override
    public String toString() {
        return "AnotherClass{" +
                "key1='" + key1 + '\'' +
                ", key2='" + key2 + '\'' +
                '}';
    }
}

Какой для вашей JSON распечатки полезной нагрузки:

DeserializationClass{nodes={node1a=[], node1b=[AnotherClass{key1='foo', key2='null'}, AnotherClass{key1='bar', key2='null'}, AnotherClass{key1='value1', key2='value1'}]}}
0 голосов
/ 10 мая 2019

Ваш node1b теперь представляет собой смешанный массив объектов, поэтому, если вы не собираетесь реализовывать полный настраиваемый десериализатор, лучшее, что вы можете получить, это List<Object>, где некоторые из этих объектов будут Map с.

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