Хорошо, с некоторыми экспериментами, и this helpful post, я смог сцепиться вместе, чтобы условно исключить издеваемое поле.
Причина, по которой я столкнулся со всей этой проблемой, заключается в том, что из-за окна Gson генерирует исключение, когда он встречает сфокусированные споки поля.
Для Spock мой чек, чтобы определить, является ли поле издевательством, - это увидеть, содержит ли имя класса значение, которое оно ссылается, подстроку EnhancerByCGLib
.
Ниже, ResizingArrayQueueOfStrings.arrayFactory
- это поле, которое может быть или не быть издевательством.
К счастью, я могу использовать один JsonSerializer
для всех классов, которым необходим такой вид лечения. В идеале, я бы не стал регистрировать сериализатор для каждого класса, который мог бы насмехаться ... но это битва на другой день.
В результате JSON, когда поле издевалось и ResizingArrayQueueOfStrings
сериализации является
queue {
"arrayFactory": "** mocked **",
}
иначе, это
queue {
"arrayFactory": {},
}
Надеется, что это помогает другим с подобной необходимостью.
public class MockSerializer implements JsonSerializer<Object> {
@Override
public JsonElement serialize(Object src, Type typeOfSrc, JsonSerializationContext context) {
Gson gson = new Gson();
String className = src.getClass().getName();
boolean isMocked = className.contains("EnhancerByCGLIB");
if (isMocked) return new JsonPrimitive("** mocked **");
else return gson.toJsonTree(src);
}
}
public class ResizingArrayQueueOfStrings {
private ArrayFactory arrayFactory;
public String toString() {
Gson gson = new GsonBuilder()
.registerTypeAdapter(ArrayFactory.class, new MockSerializer())
.setPrettyPrinting()
.create();
return gson.toJson(this);
}
}
Поправьте меня, если я ошибаюсь, но TypeAdapter это то, что делает сериализацию, это не было бы модифицировать результат, так как он сам по себе является формирование результата (JSON), как она идет, нет? – nickb
@nickb Я видел пример на SO, где сериализация по умолчанию была делегирована с помощью TypeAdapter в библиотеку, затем результат был отредактирован с помощью TypeAdapter, чтобы удалить исключенные поля перед возвратом окончательного результата. –
Интересно, есть ли у вас ссылка? Вероятно, это поможет лучше объяснить ваш вопрос, если вы сможете представить описанную вами реализацию вместе с объяснением ее недостатков. – nickb