2013-11-28 4 views
0

Мой класс исключение выглядит следующим образом, когда сериализовать с помощью Джексоном, когда я пытался десериализации его члены были названы «сообщение» и «RestoreStatus», я ожидал, что они будут «сообщение» и 'статус'.Json/Джексон именования

Почему джексон решил назвать мою переменную статуса как restoreStatus? Как работают соглашения об именах jackson/json?

@XStreamAlias("RestoreInProgressException") 
public class RestoreInProgressException extends HostManagerException { 

    private static final long serialVersionUID = xxxx; 

    private RestoreStatus status; 

    @JsonCreator 
    public RestoreInProgressException(@JsonProperty("message") String message, @JsonProperty("status") RestoreStatus status) { 
     super(message, HttpStatus.SC_CONFLICT); 
     this.status = status; 
    } 

    public RestoreStatus getRestoreStatus() { 
     return this.status; 
    } 

} 

ответ

1

Пожалуйста, смотрите этот вопрос Jackson field based serialization найти какую-то информацию, как алгоритм сериализации работает в библиотеке Джексона. В вашем примере у вас есть status, но getRestoreStatus метод getter. Джексон читает все методы getter из класса и пытается его сериализовать. Джексон также добавит к выходу JSON ваше имущество status, если вы его аннотируете @JsonProperty или @JsonProperty("status"). В этом случае ваш выход Jackson будет содержать два свойства: status и restoreStatus. Если вы хотите иметь только status свойство в вашем выводе JSON вы должны:
I. Изменение геттер имени метода getStatus:

public RestoreStatus getStatus() { 
    return this.status; 
} 

II. Добавить аннотацию @JsonProperty("status") к вашему методу:

@JsonProperty("status") 
public RestoreStatus getRestoreStatus() { 
    return this.status; 
} 
+1

Исправить. В этом случае, однако, не было бы «статуса», просто потому, что поле является «частным», и по умолчанию автоматически обнаруживаются только открытые поля (и геттеры). – StaxMan

Смежные вопросы