Преобразование объектов Json в Java - Сбой в Джексоне - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь проанализировать следующий объект, используя Джексона в Java.

[
  [null, {
    "distance": 2272,
    "duration": 580
  }, {
    "distance": 7217,
    "duration": 1393
  }, {
    "distance": 5773,
    "duration": 1061
  }, {
    "distance": 6208,
    "duration": 1170
  }, {
    "distance": 18846,
    "duration": 2686
  }],
  [{
    "distance": 2262,
    "duration": 558
  }, null, {
    "distance": 7144,
    "duration": 1366
  }, {
    "distance": 4803,
    "duration": 801
  }, {
    "distance": 5238,
    "duration": 910
  }, {
    "distance": 17876,
    "duration": 2426
  }],
  [{
    "distance": 7207,
    "duration": 1393
  }, {
    "distance": 7505,
    "duration": 1411
  }, null, {
    "distance": 12375,
    "duration": 2010
  }, {
    "distance": 12809,
    "duration": 2119
  }, {
    "distance": 24868,
    "duration": 3462
  }],
  [{
    "distance": 7481,
    "duration": 1255
  }, {
    "distance": 4643,
    "duration": 831
  }, {
    "distance": 11497,
    "duration": 2060
  }, null, {
    "distance": 434,
    "duration": 109
  }, {
    "distance": 13197,
    "duration": 1657
  }],
  [{
    "distance": 7723,
    "duration": 1326
  }, {
    "distance": 4884,
    "duration": 902
  }, {
    "distance": 11739,
    "duration": 2130
  }, {
    "distance": 434,
    "duration": 107
  }, null, {
    "distance": 12999,
    "duration": 1628
  }],
  [{
    "distance": 20372,
    "duration": 2918
  }, {
    "distance": 17534,
    "duration": 2493
  }, {
    "distance": 25912,
    "duration": 3432
  }, {
    "distance": 13669,
    "duration": 1774
  }, {
    "distance": 13414,
    "duration": 1779
  }, null]
]

Получаю ли я следующую ошибку.

Исключение в потоке "main" java.lang.IllegalArgumentException: Невозможно создать экземпляр com.beeline.DistanceMatrix (хотя существует хотя бы один создатель): нет конструктора аргумента String / метода фабрики для десериализации из значения String ('[[null, {"distance": 2272, "duration": 580}, { "расстояние": 7217, "длительность": 1393}, { "расстояние": 5773, "длительность": 1061}, { "расстояние": 6208, "длительность": 1170}, { "расстояние": 18846, "длительность": 2686}], [{ "расстояние": 2262, "длительность": 558}, нулевой, { "расстояние": 7144, "длительность": 1366}, { "расстояние": 4803,»продолжительность ": 801}, {" расстояние ": 5238," длительность ": 910}, {" расстояние ": 17876," длительность ": 2426}], [{" расстояние ": 7207," длительность ": +1393},{ "расстояние": 7505, "длительность": 1411}, нулевой, { "расстояние": 12375, "длительность": 2010}, { "расстояние": 12809, "длительность": 2119}, { "расстояние": 24868, "длительность": 3462}], [{ "расстояние": 7481, "длительность": 1255}, { "расстояние": 4643, "длительность": 831}, { "расстояние": 11497, "длительность": 2060}, Нулевой, { "расстояние": 434, "длительность": 109}, { "расстояние": 13197, "длительность" 1657}], [{ "расстояние": 7723, "длительность": 1326}, { "расстояние": 4884," длительность ": 902}, {" расстояние ": 11739," длительность ": 2130}, {" расстояние ": 434," длительность ": 107}, нулевой, {" расстояние ": 12999," продолжительность": одна тысяча шестьсот двадцать восемь}], [{" расстояние ": 20372," длительность ": 2918}, {" расстояние ": 17534," длительность ": 2493}, {" расстояние ": 25912," длительность ": 3432}, {«расстояние»: 13669, «продолжительность»: 1774}, {«расстояние»: 13414, «продолжительность»: 1779}, ноль]] ') в [Источник: НЕИЗВЕСТНО;строка: -1, столбец: -1] в com.fasterxml.jackson.databind.ObjectMapper._convert (ObjectMapper.java:3750) в com.fasterxml.jackson.databind.ObjectMapper.convertValue (ObjectMapper.java:3668) в com.beeline.JsonParser. (JsonParser.java:17)

Я использую следующие классы:

JsonParser.java

public class JsonParser {
    private DistanceMatrix matrix = new DistanceMatrix();
    public JsonParser() {
        String jsonString = "[[null,{\"distance\":2272,\"duration\":580},{\"distance\":7217,\"duration\":1393},{\"distance\":5773,\"duration\":1061},{\"distance\":6208,\"duration\":1170},{\"distance\":18846,\"duration\":2686}],[{\"distance\":2262,\"duration\":558},null,{\"distance\":7144,\"duration\":1366},{\"distance\":4803,\"duration\":801},{\"distance\":5238,\"duration\":910},{\"distance\":17876,\"duration\":2426}],[{\"distance\":7207,\"duration\":1393},{\"distance\":7505,\"duration\":1411},null,{\"distance\":12375,\"duration\":2010},{\"distance\":12809,\"duration\":2119},{\"distance\":24868,\"duration\":3462}],[{\"distance\":7481,\"duration\":1255},{\"distance\":4643,\"duration\":831},{\"distance\":11497,\"duration\":2060},null,{\"distance\":434,\"duration\":109},{\"distance\":13197,\"duration\":1657}],[{\"distance\":7723,\"duration\":1326},{\"distance\":4884,\"duration\":902},{\"distance\":11739,\"duration\":2130},{\"distance\":434,\"duration\":107},null,{\"distance\":12999,\"duration\":1628}],[{\"distance\":20372,\"duration\":2918},{\"distance\":17534,\"duration\":2493},{\"distance\":25912,\"duration\":3432},{\"distance\":13669,\"duration\":1774},{\"distance\":13414,\"duration\":1779},null]]";
        ObjectMapper oMapper = new ObjectMapper();
        oMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        oMapper.enable(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT);
        matrix = oMapper.convertValue(jsonString, DistanceMatrix.class);
        System.out.print(matrix);
    }
}

DistanceMatrix.java

public class DistanceMatrix {
    public ArrayList<ArrayList<Map<String, Float>>> matrix = new ArrayList<ArrayList<Map<String, Float>>>();
}

Я видел несколько подобных проблем на GitHub и SO.Но я не могу понять, почему это не работает.Есть какие-нибудь указатели на то, что идет не так?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Фактический ответ, который работал для меня, получен как из ответа, данного @dnt, так и из того же вопроса в группах Google, и из какого-то собственного эксперимента.

  1. Первая эта строка

matrix = oMapper.convertValue(jsonString, DistanceMatrix.class);

должен быть изменен на

try {
  matrix = oMapper.readValue(jsonString, DistanceMatrix.class);
}

Так что это будет правильно читать JSON и пытаться сопоставить его с заданной структурой.

Как только это будет сделано, он выдаст

Невозможно десериализовать экземпляр com.beeline.DistanceMatrix из токена START_ARRAY

Причина в том, что класс матрицы расстояний описываетобъект JSON.Ожидается ввод {"матрицы":}

Спасибо за комментарий, сделанный @ngueno.Будет исключение нулевого указателя, если объект нулевой.Но библиотека может принимать нулевые значения в качестве значения объекта.Пример

Для вышеуказанного класса это принято

[{"distance":7217,"duration":null},{"distance":null,"duration":1061}]

В то время как это не принято

[{"distance":7217,"duration":1393},null]

Я почти уверен, что вы справитесь с этимпо-разному в Java (я новичок).Но я заменил все мои нули на пустое обозначение объекта {} .Таким образом, пустой объект создаст карту без пары ключ-значение.Я исследую, как хранить нуль в Map структуре.Или если кто-то еще прокомментирует это, я обновлю ответ соответственно.

Спасибо за вклад, ребята.

0 голосов
/ 01 февраля 2019

Ваш класс DistanceMatrix описывает объект JSON, у которого есть ключ с именем matrix и соответствующее значение типа ArrayList<ArrayList<Map<String, Float>>>.

. Вам нужно либо обернуть JSON, чтобы он выглядел как { "matrix": <your actual JSON> }, либоукажите тип convertValue напрямую.

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