{"id":32307995,"url":"https://github.com/stablekernel/dart-codable","last_synced_at":"2026-02-22T01:38:53.785Z","repository":{"id":54257407,"uuid":"134114221","full_name":"stablekernel/dart-codable","owner":"stablekernel","description":"A library for converting dynamic, structured data (JSON, YAML) into Dart types.","archived":false,"fork":false,"pushed_at":"2021-03-31T03:56:51.000Z","size":27,"stargazers_count":38,"open_issues_count":3,"forks_count":7,"subscribers_count":5,"default_branch":"master","last_synced_at":"2023-12-05T11:56:32.036Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stablekernel.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-05-20T02:42:10.000Z","updated_at":"2020-12-28T13:39:42.000Z","dependencies_parsed_at":"2022-08-13T10:10:44.509Z","dependency_job_id":null,"html_url":"https://github.com/stablekernel/dart-codable","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"purl":"pkg:github/stablekernel/dart-codable","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stablekernel%2Fdart-codable","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stablekernel%2Fdart-codable/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stablekernel%2Fdart-codable/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stablekernel%2Fdart-codable/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stablekernel","download_url":"https://codeload.github.com/stablekernel/dart-codable/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stablekernel%2Fdart-codable/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29703227,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T23:35:04.139Z","status":"ssl_error","status_checked_at":"2026-02-21T23:35:03.832Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":"2025-10-23T07:25:53.001Z","updated_at":"2026-02-22T01:38:53.780Z","avatar_url":"https://github.com/stablekernel.png","language":"Dart","readme":"# codable\n \n[![Build Status](https://travis-ci.org/stablekernel/dart-codable.svg?branch=master)](https://travis-ci.org/stablekernel/dart-codable)\n\nA library for encoding and decoding dynamic data into Dart objects.\n\n## Basic Usage \n\nData objects extend `Coding`:\n\n```dart\nclass Person extends Coding {\n  String name;\n\n  @override\n  void decode(KeyedArchive object) {\n    // must call super\n    super.decode(object);\n\n    name = object.decode(\"name\");   \n  }\n\n  @override\n  void encode(KeyedArchive object) {\n    object.encode(\"name\", name);\n  }\n}\n```\n\nAn object that extends `Coding` can be read from JSON: \n\n```dart\nfinal json = json.decode(...);\nfinal archive = KeyedArchive.unarchive(json);\nfinal person = Person()..decode(archive);\n```\n\nObjects that extend `Coding` may also be written to JSON:\n\n```dart\nfinal person = Person()..name = \"Bob\";\nfinal archive = KeyedArchive.archive(person);\nfinal json = json.encode(archive);\n```\n\n`Coding` objects can encode or decode other `Coding` objects, including lists of `Coding` objects and maps where `Coding` objects are values. You must provide a closure that instantiates the `Coding` object being decoded.\n\n```dart\nclass Team extends Coding {\n\n  List\u003cPerson\u003e members;\n  Person manager;\n\n  @override\n  void decode(KeyedArchive object) {\n    super.decode(object); // must call super\n\n    members = object.decodeObjects(\"members\", () =\u003e Person());\n    manager = object.decodeObject(\"manager\", () =\u003e Person());\n  }\n\n  @override\n  void encode(KeyedArchive object) {\n    object.encodeObject(\"manager\", manager);\n    object.encodeObjects(\"members\", members);\n  }\n}\n```\n\n## Dynamic Type Casting \n\nTypes with primitive type arguments (e.g., `List\u003cString\u003e` or `Map\u003cString, int\u003e`) are a particular pain point when decoding. Override `castMap` in `Coding` to perform type coercion.\nYou must import `package:codable/cast.dart as cast` and prefix type names with `cast`.\n\n```dart\nimport 'package:codable/cast.dart' as cast;\nclass Container extends Coding {  \n  List\u003cString\u003e things;\n\n  @override\n  Map\u003cString, cast.Cast\u003cdynamic\u003e\u003e get castMap =\u003e {\n    \"things\": cast.List(cast.String)\n  };\n  \n\n  @override\n  void decode(KeyedArchive object) {\n    super.decode(object);\n\n    things = object.decode(\"things\");\n  }\n\n  @override\n  void encode(KeyedArchive object) {\n    object.encode(\"things\", things);\n  }\n}\n\n``` \n\n\n## Document References\n\n`Coding` objects may be referred to multiple times in a document without duplicating their structure. An object is referenced with the `$key` key. \nFor example, consider the following JSON: \n\n```json\n{\n  \"components\": {\n    \"thing\": {\n      \"name\": \"The Thing\"\n    }    \n  },\n  \"data\": {\n    \"$ref\": \"#/components/thing\"\n  }\n}\n```\n\nIn the above, the decoded value of `data` inherits all properties from `/components/thing`:\n\n```json\n{\n  \"$ref\": \"#/components/thing\",\n  \"name\": \"The Thing\"\n}\n```\n\nYou may create references in your in-memory data structures through the `Coding.referenceURI`. \n\n```dart\nfinal person = Person()..referenceURI = Uri(path: \"/teams/engineering/manager\");\n```\n\nThe above person is encoded as:\n\n```json\n{\n  \"$ref\": \"#/teams/engineering/manager\"\n}\n```\n\nYou may have cyclical references.\n\nSee the specification for [JSON Schema](http://json-schema.org) and the `$ref` keyword for more details.\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstablekernel%2Fdart-codable","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstablekernel%2Fdart-codable","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstablekernel%2Fdart-codable/lists"}