{"id":13428897,"url":"https://github.com/krud-dev/shapeshift","last_synced_at":"2026-01-12T06:43:28.536Z","repository":{"id":39452444,"uuid":"481510178","full_name":"krud-dev/shapeshift","owner":"krud-dev","description":"A Kotlin/Java library for intelligent object mapping and conversion between objects.","archived":false,"fork":false,"pushed_at":"2024-06-02T15:37:53.000Z","size":593,"stargazers_count":189,"open_issues_count":11,"forks_count":4,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-10-27T06:39:24.104Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://shapeshift.krud.dev/","language":"Kotlin","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/krud-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"2022-04-14T07:34:51.000Z","updated_at":"2024-10-02T14:55:00.000Z","dependencies_parsed_at":"2024-01-14T02:39:10.627Z","dependency_job_id":"c25b8e4e-8abb-41e6-8f97-033fece61a25","html_url":"https://github.com/krud-dev/shapeshift","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krud-dev%2Fshapeshift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krud-dev%2Fshapeshift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krud-dev%2Fshapeshift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krud-dev%2Fshapeshift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/krud-dev","download_url":"https://codeload.github.com/krud-dev/shapeshift/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243815624,"owners_count":20352202,"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":[],"created_at":"2024-07-31T01:01:08.186Z","updated_at":"2026-01-12T06:43:28.488Z","avatar_url":"https://github.com/krud-dev.png","language":"Kotlin","readme":"\u003cbr/\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/chakra-ui/chakra-ui\"\u003e\n    \u003cimg src=\".assets/logo.png\" alt=\"ShapeShift logo\" width=\"250\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\u003ch1 align=\"center\"\u003eShapeShift️\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\nA Kotlin/Java library for intelligent object mapping and conversion between objects.\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n[![Awesome Kotlin](https://img.shields.io/badge/awesome-kotlin-orange?logo=awesomelists)](https://kotlin.link/)\n![Maven Central](https://img.shields.io/maven-central/v/dev.krud/shapeshift)\n[![CircleCI](https://img.shields.io/circleci/build/github/krud-dev/shapeshift/master)](https://circleci.com/gh/krud-dev/shapeshift/tree/master)\n[![Codecov](https://img.shields.io/codecov/c/gh/krud-dev/shapeshift?token=1EG9H9RK5Q)](https://codecov.io/gh/krud-dev/shapeshift)\n[![GitHub](https://img.shields.io/github/license/krud-dev/shapeshift)](https://github.com/krud-dev/shapeshift/blob/master/LICENSE)\n[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg)](https://github.com/krud-dev/shapeshift/issues)\n\n\u003c/div\u003e\n\n- [Overview](#overview)\n- [Documentation](#documentation)\n- [Installation](#installation)\n  - [Requirements](#requirements)\n  - [Maven](#maven)\n  - [Gradle](#gradle)\n    - [Groovy DSL](#groovy-dsl)\n    - [Kotlin DSL](#kotlin-dsl)\n- [Quickstart](#quickstart)\n  - [Kotlin](#kotlin)\n    - [Kotlin DSL](#kotlin-dsl-1)\n    - [Kotlin Annotation](#kotlin-annotation)\n  - [Java](#java)\n    - [Java Builder](#java-builder)\n    - [Java Annotation](#java-annotation)\n- [Examples](#examples)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Overview\n\nShapeShift is a Kotlin first object mapping library. We have built ShapeShift because we wanted a simple to use, minimal boiler plate mapping engine, that is also flexible and supports the most advanced use cases.\n\nBuilt with Kotlin in mind, ShapeShift was designed around its ecosystem and best practices. The library has 2 main tools for mapping:\n\n* Annotations - Fully featured annotation based mapping, just add annotations to your objects and ShapeShift handles the rest. Including using custom field transformers, conditional mapping, advanced object decoration and much more. ([Kotlin Example](#kotlin-annotation), [Java Example](#java-annotation))\n* Kotlin DSL - A Kotlin DSL allowing you to define the relations between objects. This allows you to map objects you can't change (or don't want to), like objects from 3rd party libraries. Additionally you can define inline transformations, conditions and decorations, enabling deep customization and very advanced mapping. ([Kotlin Example](#kotlin-dsl-1))\n* Java Builder - The equivalent Java API for the Kotlin DSL. Allowing you to define the relations between objects without modifying their code, and map objects you can't change (or don't want to). ([Java Example](#java-builder))\n\nShapeShift main features:\n\n* Auto Mapping\n* Custom field transformers\n* Default transformers\n* [Deep mapping](https://shapeshift.krud.dev/guides/implicit-transformers)\n* Multiple mapping targets\n* Conditional mapping\n* Mapping decorators\n* Seamless spring integration\n* Native Android support\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\".assets/mapping.png\" alt=\"ShapeShift object mapping\" style=\"max-width: 800px;\" /\u003e\n\u003c/p\u003e\n\n## Documentation\n\nTo learn how to get started with **ShapeShift**, visit the official documentation website. You'll find in-depth documentation, tips and guides to help you get up and running.\n\n\u003cp\u003e\n  \u003ca href=\"https://shapeshift.krud.dev/\"\u003e\n    \u003cimg alt=\"Visit ShapeShift documentation\" src=\".assets/documentation.png\" width=\"240\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## Installation\n### Requirements\n\n* Minimum supported Kotlin version: 1.6.X\n* Minimum supported Java version: 1.8\n\n### Maven\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003edev.krud\u003c/groupId\u003e\n  \u003cartifactId\u003eshapeshift\u003c/artifactId\u003e\n  \u003cversion\u003e0.8.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### Gradle\n#### Groovy DSL\n```groovy\nimplementation 'dev.krud:shapeshift:0.8.0'\n```\n#### Kotlin DSL\n```kotlin\nimplementation(\"dev.krud:shapeshift:0.8.0\")\n```\n\n## Quickstart\n\n### Kotlin \n\n#### Kotlin DSL\n```kotlin\n// Source Class\ndata class Source(\n    val firstName: String,\n    val lastName: String,\n    val birthDate: LocalDate\n)\n\n// Target Class\ndata class Target(\n    var firstName: String = \"\",\n    var lastName: String = \"\",\n    var birthYear: Int = 0\n)\n\nfun main() {\n    /**\n     * Initialize ShapeShift with a mapping definition from From to To\n     */\n    val shapeShift = ShapeShiftBuilder()\n        .withMapping\u003cSource, Target\u003e {\n            // Map firstName\n            Source::firstName mappedTo Target::firstName\n            // Map lastName\n            Source::lastName mappedTo Target::lastName\n            // Map birthDate to birthYear with a transformation function\n            Source::birthDate mappedTo Target::birthYear withTransformer { (originalValue) -\u003e\n                originalValue?.year\n            }\n        }\n        .build()\n\n    // Initialize Source\n    val source = Source(\"John\", \"Doe\", LocalDate.of(1980, 1, 1))\n    // Perform the mapping\n    val result = shapeShift.map\u003cSource, Target\u003e(source)\n    // Returns: To(firstName=John, lastName=Doe, birthYear=1980)\n}\n```\n\n#### Kotlin Annotation\n```kotlin\n// Source Class\n@DefaultMappingTarget(Target::class)\ndata class Source(\n    @MappedField\n    val firstName: String,\n    @MappedField\n    val lastName: String,\n    @MappedField(mapTo = \"birthYear\", transformer = LocalDateToYearTransformer::class)\n    val birthDate: LocalDate\n)\n\n// Target Class\ndata class Target(\n    var firstName: String = \"\",\n    var lastName: String = \"\",\n    var birthYear: Int = 0\n)\n\n// Define the transformer which will transform the local date to a year\nclass LocalDateToYearTransformer : MappingTransformer\u003cLocalDate, Int\u003e {\n    override fun transform(context: MappingTransformerContext\u003cout LocalDate\u003e): Int? {\n        return context.originalValue?.year\n    }\n}\n\nfun main() {\n    /**\n     * Initialize ShapeShift and register the transformer\n     */\n    val shapeShift = ShapeShiftBuilder()\n        .withTransformer(LocalDateToYearTransformer())\n        .build()\n\n    // Initialize Source\n    val source = Source(\"John\", \"Doe\", LocalDate.of(1980, 1, 1))\n    // Perform the mapping\n    val result = shapeShift.map\u003cSource, Target\u003e(source)\n    // Returns: To(firstName=John, lastName=Doe, birthYear=1980)\n}\n```\n\n### Java\n\n#### Java Builder\n\n```java\n// Source.java\nclass Source {\n    private String firstName;\n    private String lastName;\n    private LocalDate birthDate;\n\n    // Constructor\n    // Getters\n    // Setters\n    // ToString\n}\n\n// Target.java\nclass Target {\n    private String firstName;\n    private String lastName;\n    private int birthYear;\n\n    // Constructor\n    // Getters\n    // Setters\n    // ToString\n}\n\n// Example.java\nclass Example {\n    public static void main(String[] args) {\n        /**\n         * Initialize ShapeShift with a mapping definition from From to To\n         */\n        ShapeShift shapeShift = new ShapeShiftBuilder()\n                .withMapping(\n                        new MappingDefinitionBuilder(Source.class, Target.class)\n                                // Map firstName\n                                .mapField(\"firstName\", \"firstName\")\n                                // Map lastName\n                                .mapField(\"lastName\", \"lastName\")\n                                // Map birthDate to birthYear with a transformation function\n                                .mapField(\"birthDate\", \"birthYear\").withTransformer(ctx -\u003e ((LocalDate) ctx.getOriginalValue()).getYear())\n                                .build()\n                )\n                .build();\n        // Initialize Source\n        Source source = new Source(\"John\", \"Doe\", LocalDate.of(1980, 1, 1));\n        // Perform the mapping\n        Target result = shapeShift.map(source, Target.class);\n        // Returns: To(firstName=John, lastName=Doe, birthYear=1980)\n    }\n}\n```\n\n#### Java Annotation\n\n```java\n// Source.java\n@DefaultMappingTarget(Target.class)\nclass Source {\n    @MappedField\n    private String firstName;\n    @MappedField\n    private String lastName;\n    @MappedField(mapTo = \"birthYear\", transformer = LocalDateToYearTransformer.class)\n    private LocalDate birthDate;\n\n    // Constructor\n    // Getters\n    // Setters\n    // ToString\n}\n\n// Target.java\nclass Target {\n    private String firstName;\n    private String lastName;\n    private int birthYear;\n\n    // Constructor\n    // Getters\n    // Setters\n    // ToString\n}\n\n// Define the transformer which will transform the local date to a year\n// LocalDateToYearTransformer.java\nclass LocalDateToYearTransformer implements MappingTransformer\u003cLocalDate, Integer\u003e {\n    @Override\n    public Integer transform(MappingTransformerContext\u003c? extends LocalDate\u003e context) {\n        return context.getOriginalValue().getYear();\n    }\n}\n// Example.java\nclass Example {\n    public static void main(String[] args) {\n        /**\n         * Initialize ShapeShift\n         */\n        ShapeShift shapeShift = new ShapeShiftBuilder()\n                .withTransformer(LocalDate.class, Integer.class, new LocalDateToYearTransformer())\n                .build();\n        // Initialize Source\n        Source source = new Source(\"John\", \"Doe\", LocalDate.of(1980, 1, 1));\n        // Perform the mapping\n        Target result = shapeShift.map(source, Target.class);\n        // Returns: To(firstName=John, lastName=Doe, birthYear=1980)\n    }\n}\n```\n\n## Examples\n\nThe [example](example/) directory contains several independent scenarios for common use cases of this library.\n\n## Contributing\n\nPull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. See [CONTRIBUTING.md](CONTRIBUTING.md) for more information.\n\n## License\nShapeShift is licensed under the [MIT](https://choosealicense.com/licenses/mit/) license. For more information, please see the [LICENSE](LICENSE) file.\n","funding_links":[],"categories":["Libraries","Bean映射\u0026复制","Kotlin","\u003ca name=\"Kotlin\"\u003e\u003c/a\u003eKotlin"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrud-dev%2Fshapeshift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkrud-dev%2Fshapeshift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrud-dev%2Fshapeshift/lists"}