Мне нужно сериализовать / десериализовать POJO, содержащий специальный Enum ( не Enum of String ).Я нахожу много образцов с помощью Enum of String, но это не мой случай.
Я прочитал документы Gson, и у меня есть начало решения с implements JsonDeserializer<T>, JsonSerializer<T>
public class ApplicationError {
private static final long serialVersionUID = 1L;
private final ErrorCode code;
private final String description;
private final URL infoURL;
....
}
public enum ErrorCode {
INVALID_URL_PARAMETER(HttpStatus.BAD_REQUEST, 20, "Invalid URL parameter value"),
MISSING_BODY(HttpStatus.BAD_REQUEST, 21, "Missing body"),
INVALID_BODY(HttpStatus.BAD_REQUEST, 22, "Invalid body")
}
public class ErrorCodeDeserializer implements JsonDeserializer<ErrorCode> /*, JsonSerializer<ErrorCode> */{
@Override
public ErrorCode deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
ErrorCode[] scopes = ErrorCode.values();
for (ErrorCode scope : scopes) {
System.out.println("--------->" + scope + " " + json.getAsString());
if (scope.equals(json.getAsString())) {
return scope;
}
}
return null;
}
/*
@Override
public JsonElement serialize(ErrorCode arg0, Type arg1, JsonSerializationContext arg2) {
???
}*/
}
...
ApplicationError applicationError = new ApplicationError(ErrorCode.INVALID_URL_PARAMETER,
"Application identifier is missing");
....
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(ErrorCode.class, new ErrorCodeDeserializer());
Gson gson = gsonBuilder.create();
gson.toJson(applicationError)
Myрезультат:
{"code": "INVALID_URL_PARAMETER", "description": "Идентификатор приложения отсутствует"}
вместо:
{"code": "20", "message": "Недопустимое значение параметра URL", "description": "Идентификатор приложения отсутствует"}
EDIT 1
Я пытаюсь с:
@Override
public JsonElement serialize(ErrorCode src, Type typeOfSrc, JsonSerializationContext context) {
JsonArray jsonMerchant = new JsonArray();
jsonMerchant.add("" + src.getCode());
jsonMerchant.add("" + src.getMessage());
return jsonMerchant;
}
, но мой результат:
{"code":["20","Invalid URL parameter value"],"description":"Application identifier is missing"}
РЕДАКТИРОВАТЬ 2
Я пытаюсь с:
@Override
public JsonElement serialize(ErrorCode src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject result = new JsonObject();
result.add("code", new JsonPrimitive(src.getCode()));
result.add("message", new JsonPrimitive(src.getMessage()));
return result;
}
но мой результат таков:
{"code":{"code":20,"message":"Invalid URL parameter value"},"description":"Application identifier is missing"}
Теперь я хочу изменить справедливо "code":{"code":20,"message":"Invalid URL parameter value"}
на "code":20,"message":"Invalid URL parameter value"