{"id":16284118,"url":"https://github.com/goodforgod/gson-configuration","last_synced_at":"2026-01-11T17:58:08.396Z","repository":{"id":43203000,"uuid":"361532024","full_name":"GoodforGod/gson-configuration","owner":"GoodforGod","description":"⚙️ Gson Configuration and DateTime serializers/deserializers for java.time.*","archived":false,"fork":false,"pushed_at":"2023-02-23T06:50:07.000Z","size":234,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-17T13:36:35.550Z","etag":null,"topics":["date","datetime","deserializer","gson","gson-adapter","java","java-8","jsr310","localdatetime","serializer","time"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GoodforGod.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-25T20:32:19.000Z","updated_at":"2024-12-25T03:53:17.000Z","dependencies_parsed_at":"2024-10-27T21:42:12.319Z","dependency_job_id":"b76e75d0-b422-4b43-b029-5af7f3a0bda6","html_url":"https://github.com/GoodforGod/gson-configuration","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":"GoodforGod/java-library-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoodforGod%2Fgson-configuration","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoodforGod%2Fgson-configuration/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoodforGod%2Fgson-configuration/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoodforGod%2Fgson-configuration/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GoodforGod","download_url":"https://codeload.github.com/GoodforGod/gson-configuration/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244538561,"owners_count":20468737,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["date","datetime","deserializer","gson","gson-adapter","java","java-8","jsr310","localdatetime","serializer","time"],"created_at":"2024-10-10T19:18:23.169Z","updated_at":"2026-01-11T17:58:08.358Z","avatar_url":"https://github.com/GoodforGod.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Gson Configuration\n\n![GraalVM Enabled](https://img.shields.io/badge/GraalVM-Ready-orange?style=plastic)\n[![GitHub Action](https://github.com/goodforgod/gson-configuration/workflows/Java%20CI/badge.svg)](https://github.com/GoodforGod/gson-configuration/actions?query=workflow%3A%22Java+CI%22)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=GoodforGod_gson-configuration\u0026metric=coverage)](https://sonarcloud.io/dashboard?id=GoodforGod_gson-configuration)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=GoodforGod_gson-configuration\u0026metric=sqale_rating)](https://sonarcloud.io/dashboard?id=GoodforGod_gson-configuration)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=GoodforGod_gson-configuration\u0026metric=ncloc)](https://sonarcloud.io/dashboard?id=GoodforGod_gson-configuration)\n\nGson configuration and serializers/deserializers for Date/Time in [java.time.*](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html) package.\n\n## Dependency :rocket:\n**Gradle**\n```groovy\nimplementation \"io.goodforgod:gson-configuration:2.0.0\"\n```\n\n**Maven**\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.goodforgod\u003c/groupId\u003e\n    \u003cartifactId\u003egson-configuration\u003c/artifactId\u003e\n    \u003cversion\u003e2.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Serializers\\Deserializers\n\nLibrary include serializers \u0026 deserializers for most [java.time.*](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html)\ndatetime objects, supported list:\n- Instant\n- LocalDate\n- LocalTime\n- LocalDateTime\n- OffsetTime\n- OffsetDateTime\n- ZonedDateTime\n- Year\n- YearMonth  \n- Month\n- MonthDay\n- DayOfWeek\n- ZoneId\n- ZoneOffset\n\n## Formatters\n\nGson Configuration by default comes with [ISO8601 with millis precision](https://goodforgod.dev/posts/2/)\n(basically default Java ISO8601 formatters but with millis precision)\n\nHere is list of such formatters:\n- LocalDateTime - *uuuu-MM-dd'T'HH:mm:ss[.SSS]*\n- LocalDate - *uuuu-MM-dd*\n- LocalTime - *HH:mm:ss[.SSS]*\n- OffsetDateTime - *uuuu-MM-dd'T'HH:mm:ss[.SSS]XXX*\n- OffsetTime - *HH:mm:ss[.SSS]XXX*\n- ZonedDateTime - *uuuu-MM-dd'T'HH:mm:ss[.SSS]XXX['['VV']']*\n\nIf you want to know more about why use such Java Date \u0026 Time formats, you can [read more here](https://goodforgod.dev/posts/2/)\n\n```java\nGsonConfiguration configuration = new GsonConfiguration();\n```\n\n## Gson Configuration\n\nLibrary provides configuration for configuring *GsonBuilder* for most properties:\n\n```java\nGsonBuilder builder = new GsonConfiguration()\n        .setDateFormat(\"yyyy-MM-dd'T'HH:mm:ss.SSSXXX\")\n        .setInstantFormat(\"uuuu-MM-dd HH:mm:ss\")\n        .setComplexMapKeySerialization(true)\n        .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)\n        .setLongSerializationPolicy(LongSerializationPolicy.STRING)\n        .setLenient(true)\n        .setEscapeHtmlChars(false)\n        .setPrettyPrinting(true)\n        .setGenerateNonExecutableJson(true)\n        .setSerializeNulls(true)\n        .setSerializeSpecialFloatingPointValues(true)\n        .setExcludeFieldsWithoutExposeAnnotation(true)\n        .setExcludeFieldsWithModifiers(GsonConfiguration.FieldModifiers.TRANSIENT)\n        .builder();\n```\n\nYou can configure DateTimeFormatters for provided adapters:\n```java\nGsonBuilder builder = new GsonConfiguration()\n        .setInstantFormat(\"uuuu-MM-dd HH:mm:ss\")\n        .builder();\n```\n\n### Properties file\n\n**By default** Gson or GsonBuilder that is build via GsonConfiguration or GsonFactory **doesn't serialize/deserialize** transient, static, volatile, synchronized fields.\nYou need to use configuration setters to configure it otherwise.\n\nGsonConfiguration also can be filled from *properties* file.\n\nHow to build GsonConfiguration from Properties:\n```java\nInputStream resource = getClass().getClassLoader().getResourceAsStream(\"gson.properties\");\nProperties properties = new Properties();\nproperties.load(resource);\n\nGsonConfiguration configuration = GsonConfiguration.ofProperties(properties);\n```\n\nFull list of properties ([check GsonProperties](https://github.com/GoodforGod/gson-configuration/blob/master/src/main/java/io/gson/adapters/config/GsonProperties.java)):\n```properties\ngson.format.instant=uuuu-MM-dd'T'HH:mm:ssX\ngson.format.localDate=uuuu-MM-dd\ngson.format.localTime=HH:mm:ss.SSS\ngson.format.localDateTime=uuuu-MM-dd'T'HH:mm:ss.SSS\ngson.format.offsetTime=HH:mm:ss.SSSXXX\ngson.format.offsetDateTime=uuuu-MM-dd'T'HH:mm:ss.SSSXXX\ngson.format.zonedDateTime=uuuu-MM-dd'T'HH:mm:ss.SSSXXX\ngson.format.year=uuuu\ngson.format.yearMonth=uuuu-MM\ngson.format.monthDay=MM-dd\ngson.format.date=yyyy-MM-dd'T'HH:mm:ss.SSSXXX\n\ngson.forceIsoChronology=true\ngson.forceResolverStrict=true\n\ngson.lenient=true\ngson.serializeNulls=true\ngson.prettyPrinting=true\ngson.escapeHtmlChars=false\ngson.generateNonExecutableJson=true\ngson.serializeComplexMapKey=true\ngson.serializeSpecialFloatingPointValues=true\ngson.excludeFieldsWithoutExposeAnnotation=false\ngson.excludeFieldsWithModifiers=TRANSIENT,STATIC,SYNCHRONIZED,VOLATILE\n\ngson.policy.fieldNaming=UPPER_CAMEL_CASE\ngson.policy.longSerialization=STRING\n```\n\n#### Factory\n\nGson can also be instantiated via properties using *GsonFactory*.\n\n*GsonFactory* is looking for property file in root *resource*: **gson.properties**\n```java\nGson gson = new GsonFactory().build();\n```\n\n## Gson Builder\n\nAll adapters already registered via when using *GsonConfiguration#builder*.\n\nYou can register them manually:\n```java\nGsonBuilder builder = new GsonBuilder()\n        .registerTypeAdapter(LocalDate.class, LocalDateSerializer.INSTANCE)\n```\n\nYou can register with custom formatter also:\n```java\nGsonBuilder builder = new GsonBuilder()\n        .registerTypeAdapter(LocalDate.class, new LocalDateSerializer(DateTimeFormatters.ISO_LOCAL_DATE))\n```\n\n## License\n\nThis project licensed under the MIT - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoodforgod%2Fgson-configuration","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoodforgod%2Fgson-configuration","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoodforgod%2Fgson-configuration/lists"}