Last active
December 1, 2023 16:56
-
-
Save jsadeli/3cb5c2d788c853099f24c68709931b50 to your computer and use it in GitHub Desktop.
Page JSON Serializer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import com.fasterxml.jackson.core.JsonGenerator | |
import com.fasterxml.jackson.databind.JsonSerializer | |
import com.fasterxml.jackson.databind.SerializerProvider | |
import org.springframework.boot.jackson.JsonComponent | |
import org.springframework.data.domain.Page | |
/** | |
* JSON serializer for [Page]. | |
* | |
* @since 2023-11-27 | |
*/ | |
@JsonComponent | |
class PageJsonSerializer<T> : JsonSerializer<Page<T>>() { | |
/** | |
* Method that can be called to ask implementation to serialize values of a type this serializer | |
* handles. This serializer replicates pre-`Spring Boot 3.2.0` JSON structure. | |
* | |
* @param page Value to serialize; CANNOT be null. | |
* @param gen Generator used to output resulting Json content | |
* @param serializers Provider that can be used to get serializers for serializing Objects value | |
* contains, if any. | |
*/ | |
override fun serialize(page: Page<T>, gen: JsonGenerator, serializers: SerializerProvider?) { | |
gen.writeStartObject() // means start, like '{}' | |
gen.writeObjectField("content", page.content) | |
gen.writeBooleanField("empty", page.isEmpty) | |
gen.writeBooleanField("first", page.isFirst) | |
gen.writeBooleanField("last", page.isLast) | |
gen.writeNumberField("number", page.number) | |
gen.writeNumberField("numberOfElements", page.numberOfElements) | |
gen.writeNumberField("size", page.size) | |
gen.writeNumberField("totalPages", page.totalPages) | |
gen.writeNumberField("totalElements", page.totalElements) | |
// mostly duplicate data (pageable.pageSize -> size, pageable.offset -> number, etc.) | |
// need special care in `Spring Boot 3.2.0` if `pageable` object is `unpaged`; otherwise error | |
if (page.pageable.isUnpaged) { | |
gen.writeStringField("pageable", "INSTANCE") | |
} else { | |
gen.writeObjectField("pageable", page.pageable) | |
} | |
gen.writeObjectField("sort", page.sort) | |
gen.writeEndObject() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment