Десериализация json, который содержит @JsonFormat (shape = JsonFormat.Shape.ARRAY) и пользовательский объект, используя Джексона - PullRequest
1 голос
/ 10 марта 2019

У меня есть пользовательский объект:

public class Response
{
    @JsonProperty("values")
    private List<Value> values;

    @JsonFormat(shape=JsonFormat.Shape.ARRAY)
    public static class Value {

        public Value(long timestamp, float val)
        {
            this.timestamp = timestamp;
            this.val = val;
        }
    }
}

Но когда это анализируется, я получаю «Невозможно десериализовать экземпляр Response $ Value из токена START_ARRAY». JSON:

{
"values":[[1552215648,18]]
}

Есть идеи, если я что-то здесь упускаю? Или я должен иметь собственный десериализатор для этого?

Ответы [ 2 ]

1 голос
/ 10 марта 2019

JsonFormat добивается цели, но вам также нужно объявить конструктор с аннотацией JsonCreator. Посмотрите на приведенный ниже пример:

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

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

public class JsonApp {

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

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

class Response {

    private List<Value> values;

    public List<Value> getValues() {
        return values;
    }

    public void setValues(List<Value> values) {
        this.values = values;
    }

    @Override
    public String toString() {
        return "Response{" +
                "values=" + values +
                '}';
    }
}

@JsonFormat(shape = JsonFormat.Shape.ARRAY)
class Value {

    private long timestamp;
    private float val;

    @JsonCreator
    public Value(@JsonProperty("timestamp") long timestamp, @JsonProperty("val") float val) {
        this.timestamp = timestamp;
        this.val = val;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    public float getVal() {
        return val;
    }

    public void setVal(float val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "Value{" +
                "timestamp=" + timestamp +
                ", val=" + val +
                '}';
    }
}

Над кодом ниже JSON Полезная нагрузка:

{
  "values": [
    [
      1552215648,
      18
    ],
    [
      123,
      12.24
    ]
  ]
}

Печать:

Response{values=[Value{timestamp=1552215648, val=18.0}, Value{timestamp=123, val=12.24}]}
0 голосов
/ 10 марта 2019

Вы должны JsonFormat над переменной values. Кроме того, поскольку у вас есть переменная типа List, вам не нужно добавлять JsonFormat.

public class Response
    {
        @JsonProperty("values")
        @JsonFormat(shape=JsonFormat.Shape.ARRAY)
        private List<Value> values;

        public static class Value {
            private long timestamp;
            private float val;

            // Getters and Setters

            public Value(long timestamp, float val)
            {
                this.timestamp = timestamp;
                this.val = val;
            }
        }
    }

Ваш формат ввода JSON будет:

{
  values: [
     {
       "timestamp": 589988,
       "val": 56.0,
      }
   ]
}

Надеюсь, это поможет! Я не тестировал код, поэтому, пожалуйста, игнорируйте синтаксические проблемы, если таковые имеются.

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