Не удалось прочитать JSON: нераспознанное поле _links — клиент Android REST HATEOAS

Я следовал этому руководству для клиента Android REST, но вместо службы приветствия , я использовал свой собственный сервис REST HATEOAS, который возвращает HAL+JSON в следующем формате:

"name" : "new task",
"description" : "this is new task",
"_links" : {
"self" : {
  "href" : "http://test/tasks/1"
},
"item" : {
  "href" : "http://test/tasks/1/item"
},
}

Я получаю эту ошибку во время выполнения:

Could not read JSON: Unrecognized field "_links" 
(class com.test.mobile.model.Task), not marked as ignorable 
(3 known properties: "name", "item", "description"])

В этой строке в MainActivity:

Task task = restTemplate.getForObject(url, Task.class);

Я бы скопировал/вставил весь код, но он идентичен коду из учебника, за исключением того, что вместо приветствия у него есть два класса:

public class Task {
private String name;
private String description;
private Item item;

public Task() {
}
/*getters and setters*/
}

public class Item {
private String name;
private Set<Task> tasks = new HashSet<Task>(0);

public Item() {
}
/*getters and setters*/
}

Я искал какой-нибудь учебник или код с HATEOAS, но не нашел ничего подходящего.

Как я могу изменить свой код для весны, чтобы иметь возможность анализировать HATEOAS _links?


person Miljac    schedule 12.06.2015    source источник


Ответы (2)


У вас нет поля для «_links», вам нужно его игнорировать ИЛИ добавить небольшой класс, который будет принимать этот объект.

// Add this and you will get error on "self" that is not mark as ignore:
public class _links {

}

Как вы можете это решить? Просто добавьте еще один вложенный класс. имейте в виду, что это стало уродливым быстро, я только что объяснил идею.

person Remy    schedule 12.06.2015
comment
Я знаю, что могу добавить класс _links, но это не похоже на правильный способ сделать это, скорее обходной путь - person Miljac; 15.06.2015
comment
@Miljac Нет, это просто стиль различия, в json.net и JS вы просто назначаете для var. В любом случае, я мало что знаю о spring, но Gson поддерживает геттеры и сеттеры, может быть, вы могли бы сделать геттер и разобрать его внутри. (В любом случае, я надеюсь, что через весну будет прямой путь, но я плохо знаю эту структуру). - person Remy; 15.06.2015
comment
Поскольку я внедрил собственные сериализаторы, которые анализируют _links, я приму это как правильный ответ. - person Miljac; 31.07.2015

реальным решением является аннотация JsonIgnoreProperties, которая написана здесь https://stackoverflow.com/a/26614217/4173048.

person withoutOne    schedule 28.03.2021