Как сериализовать пользовательский ключ на карте с Джексоном - PullRequest
0 голосов
/ 03 ноября 2019

Мне нужно получить следующую структуру в результате сериализации

[
  {
    "employee_name":Joris",
    "working_since":2013-02-20T14:28:00Z",
    "tasks:": [
      {
        "start_date": "2015-12-23T14:50:48Z",
        "task_name": "CLEAN"
      },
      {
        "start_date": "2016-02-11T11:57:00Z",
        "task_name": "WRITE"
      }
    ],
    "employee_name":Alex",
    "working_since":2017-11-14T15:23:15Z",
    "tasks:": [
      {
        "start_date": "2018-06-20T11:50:49Z",
        "task_name": "SELL"
      }
    ]
  }
]

У меня есть TreeMap (ключ - Сотрудник, значение - Список задач) для этого. Карта группируется по сотруднику, и у меня нет проблем с сериализацией значения, но у меня проблема с сериализацией ключа карты. Джексон всегда использует метод toString () класса Employee для сериализации. Класс сотрудников ниже:

public class Employee {

    private int id;
    private String name;


    @JsonFormat(
            shape = JsonFormat.Shape.STRING,
            pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
    private Date working_since;

    public Employee(int id, String name, Date working_since) {
        this.id = id;
        this.name = name;
        this.working_since = working_since;
    }

    public Employee() {
    }


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getWorking_since() {
        return active_since;
    }

    public void setWorking_since(Date Working_since) {
        this.working_since = working_since;
    }

   @Override
    public String toString() {
        String string = String.format("employee_name\":\"%s\",\"working_since\":\"%s\",\"tasks",
                getName(), new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(getWorking_since()));
        return string;
    }


}

У меня есть метод сериализации

public class JsonProcessor  {

    public JsonStreamProcessor() {

    }


    @Override
    public void process(InputStream source, OutputStream output) throws IOException {


        Map<Picker, List<Pick>>tasks = new TreeMap<Employer, List<Task>>();
        tasks.put(...);
        tasks.put(...);
        tasks.put(...);



            JSONHelper.writeObject(output, tasks);


    }

Мой класс JSONHelper следующий:

public class JSONHelper {

    private static ObjectMapper objectMapper = new ObjectMapper();


    public static void writeObject(OutputStream outputStream, Object object) {
        Object[] objectToJson = new Object[] {object};

        try {
            objectMapper.writeValue(outputStream, objectToJson);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }


}

Я пытался использовать CustomSerializer, ноЯ не понимал, как настроить это для использования с пользовательским ключом карты и как создать структуру json, которая совместима с требуемой структурой json.

Спасибо за помощь!

...