diff --git a/base/elixir/test/inputs/json/misc/050b0.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/050b0.json/default/QuickType.ex
index c3b0990..c894050 100644
--- a/base/elixir/test/inputs/json/misc/050b0.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/050b0.json/default/QuickType.ex
@@ -251,7 +251,7 @@ defmodule OtherName do
   def from_map(m) do
     %OtherName{
       name: decode_name(m["name"]),
-      note: Map.fetch!(m, "note"),
+      note: decode_note(Map.fetch!(m, "note")),
     }
   end
 
@@ -477,7 +477,7 @@ defmodule TopLevelElement do
       links: Enum.map(m["links"], &Link.from_map/1),
       name: decode_name(m["name"]),
       other_names: Enum.map(m["other_names"], &OtherName.from_map/1),
-      superseded_by: Map.fetch!(m, "superseded_by"),
+      superseded_by: decode_superseded_by(Map.fetch!(m, "superseded_by")),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex
index 107aa35..cdf7772 100644
--- a/base/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex
@@ -1578,7 +1578,7 @@ defmodule Payload do
       action: m["action"],
       before: m["before"],
       commits: m["commits"] && Enum.map(m["commits"], &Commit.from_map/1),
-      description: m["description"],
+      description: m["description"] && decode_description(m["description"]),
       distinct_size: m["distinct_size"],
       head: m["head"],
       master_branch: m["master_branch"],
diff --git a/base/elixir/test/inputs/json/misc/10be4.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/10be4.json/default/QuickType.ex
index 9425aaf..a26c668 100644
--- a/base/elixir/test/inputs/json/misc/10be4.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/10be4.json/default/QuickType.ex
@@ -260,7 +260,7 @@ defmodule OtherName do
   def from_map(m) do
     %OtherName{
       name: decode_name(m["name"]),
-      note: Map.fetch!(m, "note"),
+      note: decode_note(Map.fetch!(m, "note")),
     }
   end
 
@@ -488,7 +488,7 @@ defmodule TopLevelElement do
       links: Enum.map(m["links"], &Link.from_map/1),
       name: decode_name(m["name"]),
       other_names: Enum.map(m["other_names"], &OtherName.from_map/1),
-      superseded_by: Map.fetch!(m, "superseded_by"),
+      superseded_by: decode_superseded_by(Map.fetch!(m, "superseded_by")),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/1b409.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/1b409.json/default/QuickType.ex
index 7e199b3..5f86f85 100644
--- a/base/elixir/test/inputs/json/misc/1b409.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/1b409.json/default/QuickType.ex
@@ -90,7 +90,7 @@ defmodule Extra do
     %Extra{
       address: decode_address(m["address"]),
       contact_form: m["contact_form"],
-      fax: m["fax"],
+      fax: m["fax"] && decode_fax(m["fax"]),
       office: decode_office(m["office"]),
       rss_url: m["rss_url"],
     }
@@ -419,10 +419,10 @@ defmodule Person do
       namemod: Namemod.decode(m["namemod"]),
       nickname: decode_nickname(m["nickname"]),
       osid: decode_osid(m["osid"]),
-      pvsid: Map.fetch!(m, "pvsid"),
+      pvsid: decode_pvsid(Map.fetch!(m, "pvsid")),
       sortname: decode_sortname(m["sortname"]),
-      twitterid: Map.fetch!(m, "twitterid"),
-      youtubeid: Map.fetch!(m, "youtubeid"),
+      twitterid: decode_twitterid(Map.fetch!(m, "twitterid")),
+      youtubeid: decode_youtubeid(Map.fetch!(m, "youtubeid")),
     }
   end
 
@@ -716,7 +716,7 @@ defmodule Object do
       enddate: decode_enddate(m["enddate"]),
       extra: Extra.from_map(m["extra"]),
       id: decode_id(m["id"]),
-      leadership_title: Map.fetch!(m, "leadership_title"),
+      leadership_title: decode_leadership_title(Map.fetch!(m, "leadership_title")),
       party: Party.decode(m["party"]),
       person: Person.from_map(m["person"]),
       phone: decode_phone(m["phone"]),
diff --git a/base/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex
index be06071..ea418d1 100644
--- a/base/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex
@@ -1033,8 +1033,8 @@ defmodule ChildData do
       approved_by: decode_approved_by(m["approved_by"]),
       archived: decode_archived(m["archived"]),
       author: decode_author(m["author"]),
-      author_flair_css_class: Map.fetch!(m, "author_flair_css_class"),
-      author_flair_text: Map.fetch!(m, "author_flair_text"),
+      author_flair_css_class: decode_author_flair_css_class(Map.fetch!(m, "author_flair_css_class")),
+      author_flair_text: decode_author_flair_text(Map.fetch!(m, "author_flair_text")),
       banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
       banned_by: decode_banned_by(m["banned_by"]),
       brand_safe: decode_brand_safe(m["brand_safe"]),
@@ -1044,7 +1044,7 @@ defmodule ChildData do
       contest_mode: decode_contest_mode(m["contest_mode"]),
       created: decode_created(m["created"]),
       created_utc: decode_created_utc(m["created_utc"]),
-      distinguished: Map.fetch!(m, "distinguished"),
+      distinguished: decode_distinguished(Map.fetch!(m, "distinguished")),
       domain: Domain.decode(m["domain"]),
       downs: decode_downs(m["downs"]),
       edited: decode_edited(m["edited"]),
@@ -1055,8 +1055,8 @@ defmodule ChildData do
       is_self: decode_is_self(m["is_self"]),
       is_video: decode_is_video(m["is_video"]),
       likes: decode_likes(m["likes"]),
-      link_flair_css_class: Map.fetch!(m, "link_flair_css_class"),
-      link_flair_text: Map.fetch!(m, "link_flair_text"),
+      link_flair_css_class: decode_link_flair_css_class(Map.fetch!(m, "link_flair_css_class")),
+      link_flair_text: decode_link_flair_text(Map.fetch!(m, "link_flair_text")),
       locked: decode_locked(m["locked"]),
       media: m["media"] && Media.from_map(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
@@ -1076,7 +1076,7 @@ defmodule ChildData do
       secure_media: m["secure_media"] && Media.from_map(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
       selftext: decode_selftext(m["selftext"]),
-      selftext_html: Map.fetch!(m, "selftext_html"),
+      selftext_html: decode_selftext_html(Map.fetch!(m, "selftext_html")),
       spoiler: decode_spoiler(m["spoiler"]),
       stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
@@ -1085,8 +1085,8 @@ defmodule ChildData do
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
       suggested_sort: decode_suggested_sort(m["suggested_sort"]),
       thumbnail: decode_thumbnail(m["thumbnail"]),
-      thumbnail_height: Map.fetch!(m, "thumbnail_height"),
-      thumbnail_width: Map.fetch!(m, "thumbnail_width"),
+      thumbnail_height: decode_thumbnail_height(Map.fetch!(m, "thumbnail_height")),
+      thumbnail_width: decode_thumbnail_width(Map.fetch!(m, "thumbnail_width")),
       title: decode_title(m["title"]),
       ups: decode_ups(m["ups"]),
       url: decode_url(m["url"]),
diff --git a/base/elixir/test/inputs/json/misc/29f47.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/29f47.json/default/QuickType.ex
index bf1c5b8..725b719 100644
--- a/base/elixir/test/inputs/json/misc/29f47.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/29f47.json/default/QuickType.ex
@@ -976,7 +976,7 @@ defmodule ChildData do
       distinguished: Distinguished.decode(m["distinguished"]),
       domain: Domain.decode(m["domain"]),
       downs: decode_downs(m["downs"]),
-      edited: Map.fetch!(m, "edited"),
+      edited: decode_edited(Map.fetch!(m, "edited")),
       gilded: decode_gilded(m["gilded"]),
       hidden: decode_hidden(m["hidden"]),
       hide_score: decode_hide_score(m["hide_score"]),
@@ -1005,17 +1005,17 @@ defmodule ChildData do
       secure_media: decode_secure_media(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
       selftext: decode_selftext(m["selftext"]),
-      selftext_html: Map.fetch!(m, "selftext_html"),
+      selftext_html: decode_selftext_html(Map.fetch!(m, "selftext_html")),
       spoiler: decode_spoiler(m["spoiler"]),
       stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
       subreddit_id: SubredditID.decode(m["subreddit_id"]),
       subreddit_name_prefixed: SubredditNamePrefixed.decode(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
-      suggested_sort: Map.fetch!(m, "suggested_sort"),
+      suggested_sort: decode_suggested_sort(Map.fetch!(m, "suggested_sort")),
       thumbnail: decode_thumbnail(m["thumbnail"]),
-      thumbnail_height: Map.fetch!(m, "thumbnail_height"),
-      thumbnail_width: Map.fetch!(m, "thumbnail_width"),
+      thumbnail_height: decode_thumbnail_height(Map.fetch!(m, "thumbnail_height")),
+      thumbnail_width: decode_thumbnail_width(Map.fetch!(m, "thumbnail_width")),
       title: decode_title(m["title"]),
       ups: decode_ups(m["ups"]),
       url: decode_url(m["url"]),
diff --git a/base/elixir/test/inputs/json/misc/2d4e2.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/2d4e2.json/default/QuickType.ex
index 1c2e2fc..6bbb2be 100644
--- a/base/elixir/test/inputs/json/misc/2d4e2.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/2d4e2.json/default/QuickType.ex
@@ -432,8 +432,8 @@ defmodule Person do
       osid: decode_osid(m["osid"]),
       pvsid: decode_pvsid(m["pvsid"]),
       sortname: decode_sortname(m["sortname"]),
-      twitterid: Map.fetch!(m, "twitterid"),
-      youtubeid: Map.fetch!(m, "youtubeid"),
+      twitterid: decode_twitterid(Map.fetch!(m, "twitterid")),
+      youtubeid: decode_youtubeid(Map.fetch!(m, "youtubeid")),
     }
   end
 
@@ -894,7 +894,7 @@ defmodule Object do
       enddate: decode_enddate(m["enddate"]),
       extra: Extra.from_map(m["extra"]),
       id: decode_id(m["id"]),
-      leadership_title: Map.fetch!(m, "leadership_title"),
+      leadership_title: decode_leadership_title(Map.fetch!(m, "leadership_title")),
       party: Party.decode(m["party"]),
       person: Person.from_map(m["person"]),
       phone: decode_phone(m["phone"]),
diff --git a/base/elixir/test/inputs/json/misc/32431.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/32431.json/default/QuickType.ex
index 9d90f88..4b5233f 100644
--- a/base/elixir/test/inputs/json/misc/32431.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/32431.json/default/QuickType.ex
@@ -393,15 +393,15 @@ defmodule Properties do
       cdi: decode_cdi(m["cdi"]),
       code: decode_code(m["code"]),
       detail: decode_detail(m["detail"]),
-      dmin: Map.fetch!(m, "dmin"),
+      dmin: decode_dmin(Map.fetch!(m, "dmin")),
       felt: decode_felt(m["felt"]),
-      gap: Map.fetch!(m, "gap"),
+      gap: decode_gap(Map.fetch!(m, "gap")),
       ids: decode_ids(m["ids"]),
       mag: decode_mag(m["mag"]),
       mag_type: MagType.decode(m["magType"]),
       mmi: decode_mmi(m["mmi"]),
       net: decode_net(m["net"]),
-      nst: Map.fetch!(m, "nst"),
+      nst: decode_nst(Map.fetch!(m, "nst")),
       place: decode_place(m["place"]),
       rms: decode_rms(m["rms"]),
       sig: decode_sig(m["sig"]),
diff --git a/base/elixir/test/inputs/json/misc/32d5c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/32d5c.json/default/QuickType.ex
index 6889b82..c4b52c9 100644
--- a/base/elixir/test/inputs/json/misc/32d5c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/32d5c.json/default/QuickType.ex
@@ -64,7 +64,7 @@ defmodule TopLevelElement do
 
   def from_map(m) do
     %TopLevelElement{
-      birth_date: Map.fetch!(m, "BirthDate"),
+      birth_date: decode_birth_date(Map.fetch!(m, "BirthDate")),
       birth_date_is_protected: decode_birth_date_is_protected(m["BirthDateIsProtected"]),
       gender_type_id: decode_gender_type_id(m["GenderTypeID"]),
       notes: decode_notes(m["Notes"]),
diff --git a/base/elixir/test/inputs/json/misc/337ed.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/337ed.json/default/QuickType.ex
index 3b174ee..ebadc10 100644
--- a/base/elixir/test/inputs/json/misc/337ed.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/337ed.json/default/QuickType.ex
@@ -382,35 +382,35 @@ defmodule Result do
 
   def from_map(m) do
     %Result{
-      cost_absolute: Map.fetch!(m, "cost_absolute"),
-      cost_max: Map.fetch!(m, "cost_max"),
-      cost_min: Map.fetch!(m, "cost_min"),
+      cost_absolute: decode_cost_absolute(Map.fetch!(m, "cost_absolute")),
+      cost_max: decode_cost_max(Map.fetch!(m, "cost_max")),
+      cost_min: decode_cost_min(Map.fetch!(m, "cost_min")),
       created_at: decode_created_at(m["created_at"]),
       custom_incomes: Enum.map(m["customIncomes"], &CustomIncome.from_map/1),
       direct_rep_costs_max: decode_direct_rep_costs_max(m["direct_rep_costs_max"]),
       direct_rep_costs_min: decode_direct_rep_costs_min(m["direct_rep_costs_min"]),
       end_date: decode_end_date(m["end_date"]),
       eur_sources_grants: decode_eur_sources_grants(m["eur_sources_grants"]),
-      eur_sources_grants_src: Map.fetch!(m, "eur_sources_grants_src"),
+      eur_sources_grants_src: decode_eur_sources_grants_src(Map.fetch!(m, "eur_sources_grants_src")),
       eur_sources_procurement: decode_eur_sources_procurement(m["eur_sources_procurement"]),
-      eur_sources_procurement_src: Map.fetch!(m, "eur_sources_procurement_src"),
+      eur_sources_procurement_src: decode_eur_sources_procurement_src(Map.fetch!(m, "eur_sources_procurement_src")),
       id: decode_id(m["id"]),
       new_organisation: decode_new_organisation(m["new_organisation"]),
-      no_clients: Map.fetch!(m, "no_clients"),
-      other_financial_information: Map.fetch!(m, "other_financial_information"),
-      other_sources_contributions: Map.fetch!(m, "other_sources_contributions"),
-      other_sources_donation: Map.fetch!(m, "other_sources_donation"),
-      other_sources_total: Map.fetch!(m, "other_sources_total"),
-      public_financing_infranational: Map.fetch!(m, "public_financing_infranational"),
-      public_financing_national: Map.fetch!(m, "public_financing_national"),
-      public_financing_total: Map.fetch!(m, "public_financing_total"),
+      no_clients: decode_no_clients(Map.fetch!(m, "no_clients")),
+      other_financial_information: decode_other_financial_information(Map.fetch!(m, "other_financial_information")),
+      other_sources_contributions: decode_other_sources_contributions(Map.fetch!(m, "other_sources_contributions")),
+      other_sources_donation: decode_other_sources_donation(Map.fetch!(m, "other_sources_donation")),
+      other_sources_total: decode_other_sources_total(Map.fetch!(m, "other_sources_total")),
+      public_financing_infranational: decode_public_financing_infranational(Map.fetch!(m, "public_financing_infranational")),
+      public_financing_national: decode_public_financing_national(Map.fetch!(m, "public_financing_national")),
+      public_financing_total: decode_public_financing_total(Map.fetch!(m, "public_financing_total")),
       representative: decode_representative(m["representative"]),
       start_date: decode_start_date(m["start_date"]),
       status: Status.decode(m["status"]),
-      total_budget: Map.fetch!(m, "total_budget"),
-      turnover_absolute: Map.fetch!(m, "turnover_absolute"),
-      turnover_max: Map.fetch!(m, "turnover_max"),
-      turnover_min: Map.fetch!(m, "turnover_min"),
+      total_budget: decode_total_budget(Map.fetch!(m, "total_budget")),
+      turnover_absolute: decode_turnover_absolute(Map.fetch!(m, "turnover_absolute")),
+      turnover_max: decode_turnover_max(Map.fetch!(m, "turnover_max")),
+      turnover_min: decode_turnover_min(Map.fetch!(m, "turnover_min")),
       type: ResultType.decode(m["type"]),
       updated_at: decode_updated_at(m["updated_at"]),
       uri: decode_uri(m["uri"]),
diff --git a/base/elixir/test/inputs/json/misc/34702.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/34702.json/default/QuickType.ex
index 0d669c1..b017620 100644
--- a/base/elixir/test/inputs/json/misc/34702.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/34702.json/default/QuickType.ex
@@ -484,7 +484,7 @@ defmodule FeatureProperties do
       latitude: decode_latitude(m["latitude"]),
       local_govt: decode_local_govt(m["local_govt"]),
       longitude: decode_longitude(m["longitude"]),
-      no: Map.fetch!(m, "no"),
+      no: decode_no(Map.fetch!(m, "no")),
       phone: decode_phone(m["phone"]),
       postcode: decode_postcode(m["postcode"]),
       psa: decode_psa(m["psa"]),
diff --git a/base/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex
index b7a21b8..00aa6a0 100644
--- a/base/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex
@@ -1094,8 +1094,8 @@ defmodule ChildData do
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
       suggested_sort: decode_suggested_sort(m["suggested_sort"]),
       thumbnail: decode_thumbnail(m["thumbnail"]),
-      thumbnail_height: Map.fetch!(m, "thumbnail_height"),
-      thumbnail_width: Map.fetch!(m, "thumbnail_width"),
+      thumbnail_height: decode_thumbnail_height(Map.fetch!(m, "thumbnail_height")),
+      thumbnail_width: decode_thumbnail_width(Map.fetch!(m, "thumbnail_width")),
       title: decode_title(m["title"]),
       ups: decode_ups(m["ups"]),
       url: decode_url(m["url"]),
diff --git a/base/elixir/test/inputs/json/misc/570ec.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/570ec.json/default/QuickType.ex
index 0e99691..9d3b8eb 100644
--- a/base/elixir/test/inputs/json/misc/570ec.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/570ec.json/default/QuickType.ex
@@ -160,7 +160,7 @@ defmodule OtherName do
   def from_map(m) do
     %OtherName{
       name: decode_name(m["name"]),
-      note: Map.fetch!(m, "note"),
+      note: decode_note(Map.fetch!(m, "note")),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/66121.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/66121.json/default/QuickType.ex
index 285c8c9..964b929 100644
--- a/base/elixir/test/inputs/json/misc/66121.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/66121.json/default/QuickType.ex
@@ -428,7 +428,7 @@ defmodule TopLevelElement do
       links: Enum.map(m["links"], &Link.from_map/1),
       name: decode_name(m["name"]),
       other_names: decode_other_names(m["other_names"]),
-      superseded_by: Map.fetch!(m, "superseded_by"),
+      superseded_by: decode_superseded_by(Map.fetch!(m, "superseded_by")),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex
index 0551342..3c87ded 100644
--- a/base/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex
@@ -935,8 +935,8 @@ defmodule ChildData do
       approved_by: decode_approved_by(m["approved_by"]),
       archived: decode_archived(m["archived"]),
       author: decode_author(m["author"]),
-      author_flair_css_class: Map.fetch!(m, "author_flair_css_class"),
-      author_flair_text: Map.fetch!(m, "author_flair_text"),
+      author_flair_css_class: decode_author_flair_css_class(Map.fetch!(m, "author_flair_css_class")),
+      author_flair_text: decode_author_flair_text(Map.fetch!(m, "author_flair_text")),
       banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
       banned_by: decode_banned_by(m["banned_by"]),
       brand_safe: decode_brand_safe(m["brand_safe"]),
@@ -957,8 +957,8 @@ defmodule ChildData do
       is_self: decode_is_self(m["is_self"]),
       is_video: decode_is_video(m["is_video"]),
       likes: decode_likes(m["likes"]),
-      link_flair_css_class: Map.fetch!(m, "link_flair_css_class"),
-      link_flair_text: Map.fetch!(m, "link_flair_text"),
+      link_flair_css_class: decode_link_flair_css_class(Map.fetch!(m, "link_flair_css_class")),
+      link_flair_text: decode_link_flair_text(Map.fetch!(m, "link_flair_text")),
       locked: decode_locked(m["locked"]),
       media: m["media"] && Media.from_map(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
@@ -978,17 +978,17 @@ defmodule ChildData do
       secure_media: m["secure_media"] && Media.from_map(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
       selftext: decode_selftext(m["selftext"]),
-      selftext_html: Map.fetch!(m, "selftext_html"),
+      selftext_html: decode_selftext_html(Map.fetch!(m, "selftext_html")),
       spoiler: decode_spoiler(m["spoiler"]),
       stickied: decode_stickied(m["stickied"]),
       subreddit: decode_subreddit(m["subreddit"]),
       subreddit_id: decode_subreddit_id(m["subreddit_id"]),
       subreddit_name_prefixed: decode_subreddit_name_prefixed(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
-      suggested_sort: Map.fetch!(m, "suggested_sort"),
+      suggested_sort: decode_suggested_sort(Map.fetch!(m, "suggested_sort")),
       thumbnail: decode_thumbnail(m["thumbnail"]),
-      thumbnail_height: Map.fetch!(m, "thumbnail_height"),
-      thumbnail_width: Map.fetch!(m, "thumbnail_width"),
+      thumbnail_height: decode_thumbnail_height(Map.fetch!(m, "thumbnail_height")),
+      thumbnail_width: decode_thumbnail_width(Map.fetch!(m, "thumbnail_width")),
       title: decode_title(m["title"]),
       ups: decode_ups(m["ups"]),
       url: decode_url(m["url"]),
diff --git a/base/elixir/test/inputs/json/misc/734ad.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/734ad.json/default/QuickType.ex
index 2c0ef7a..e752355 100644
--- a/base/elixir/test/inputs/json/misc/734ad.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/734ad.json/default/QuickType.ex
@@ -359,21 +359,21 @@ defmodule Result do
 
   def from_map(m) do
     %Result{
-      acronym: Map.fetch!(m, "acronym"),
+      acronym: decode_acronym(Map.fetch!(m, "acronym")),
       activity_consult_committees: decode_activity_consult_committees(m["activity_consult_committees"]),
       activity_eu_legislative: decode_activity_eu_legislative(m["activity_eu_legislative"]),
       activity_expert_groups: decode_activity_expert_groups(m["activity_expert_groups"]),
       activity_high_level_groups: decode_activity_high_level_groups(m["activity_high_level_groups"]),
       activity_industry_forums: decode_activity_industry_forums(m["activity_industry_forums"]),
       activity_inter_groups: decode_activity_inter_groups(m["activity_inter_groups"]),
-      activity_other: Map.fetch!(m, "activity_other"),
+      activity_other: decode_activity_other(Map.fetch!(m, "activity_other")),
       activity_relevant_comm: decode_activity_relevant_comm(m["activity_relevant_comm"]),
       be_office_country: m["be_office_country"],
-      be_office_lat: m["be_office_lat"],
-      be_office_lon: m["be_office_lon"],
+      be_office_lat: m["be_office_lat"] && decode_be_office_lat(m["be_office_lat"]),
+      be_office_lon: m["be_office_lon"] && decode_be_office_lon(m["be_office_lon"]),
       be_office_phone: m["be_office_phone"],
-      be_office_post_code: m["be_office_post_code"],
-      be_office_postbox: m["be_office_postbox"],
+      be_office_post_code: m["be_office_post_code"] && decode_be_office_post_code(m["be_office_post_code"]),
+      be_office_postbox: m["be_office_postbox"] && decode_be_office_postbox(m["be_office_postbox"]),
       be_office_street: m["be_office_street"],
       be_office_town: m["be_office_town"],
       code_of_conduct: decode_code_of_conduct(m["code_of_conduct"]),
@@ -383,11 +383,11 @@ defmodule Result do
       goals: decode_goals(m["goals"]),
       head: decode_head(m["head"]),
       head_office_country: decode_head_office_country(m["head_office_country"]),
-      head_office_lat: Map.fetch!(m, "head_office_lat"),
-      head_office_lon: Map.fetch!(m, "head_office_lon"),
+      head_office_lat: decode_head_office_lat(Map.fetch!(m, "head_office_lat")),
+      head_office_lon: decode_head_office_lon(Map.fetch!(m, "head_office_lon")),
       head_office_phone: decode_head_office_phone(m["head_office_phone"]),
-      head_office_post_code: Map.fetch!(m, "head_office_post_code"),
-      head_office_postbox: Map.fetch!(m, "head_office_postbox"),
+      head_office_post_code: decode_head_office_post_code(Map.fetch!(m, "head_office_post_code")),
+      head_office_postbox: decode_head_office_postbox(Map.fetch!(m, "head_office_postbox")),
       head_office_street: decode_head_office_street(m["head_office_street"]),
       head_office_town: decode_head_office_town(m["head_office_town"]),
       id: decode_id(m["id"]),
@@ -399,16 +399,16 @@ defmodule Result do
       main_category: decode_main_category(m["main_category"]),
       main_category_title: decode_main_category_title(m["main_category_title"]),
       members: decode_members(m["members"]),
-      members_100: Map.fetch!(m, "members_100"),
-      members_25: Map.fetch!(m, "members_25"),
-      members_50: Map.fetch!(m, "members_50"),
-      members_75: Map.fetch!(m, "members_75"),
+      members_100: decode_members_100(Map.fetch!(m, "members_100")),
+      members_25: decode_members_25(Map.fetch!(m, "members_25")),
+      members_50: decode_members_50(Map.fetch!(m, "members_50")),
+      members_75: decode_members_75(Map.fetch!(m, "members_75")),
       members_fte: decode_members_fte(m["members_fte"]),
       name: decode_name(m["name"]),
       native_name: decode_native_name(m["native_name"]),
-      networking: Map.fetch!(m, "networking"),
-      number_of_natural_persons: Map.fetch!(m, "number_of_natural_persons"),
-      other_code_of_conduct: Map.fetch!(m, "other_code_of_conduct"),
+      networking: decode_networking(Map.fetch!(m, "networking")),
+      number_of_natural_persons: decode_number_of_natural_persons(Map.fetch!(m, "number_of_natural_persons")),
+      other_code_of_conduct: decode_other_code_of_conduct(Map.fetch!(m, "other_code_of_conduct")),
       registration_date: decode_registration_date(m["registration_date"]),
       status: Status.decode(m["status"]),
       structure_members: decode_structure_members(m["structure_members"]),
@@ -416,7 +416,7 @@ defmodule Result do
       sub_category_title: decode_sub_category_title(m["sub_category_title"]),
       updated_at: decode_updated_at(m["updated_at"]),
       uri: decode_uri(m["uri"]),
-      web_site_url: Map.fetch!(m, "web_site_url"),
+      web_site_url: decode_web_site_url(Map.fetch!(m, "web_site_url")),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/7f568.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/7f568.json/default/QuickType.ex
index d8eba46..ed10199 100644
--- a/base/elixir/test/inputs/json/misc/7f568.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/7f568.json/default/QuickType.ex
@@ -271,7 +271,7 @@ defmodule TopLevelElement do
       comments_url: decode_comments_url(m["comments_url"]),
       commits_url: decode_commits_url(m["commits_url"]),
       created_at: decode_created_at(m["created_at"]),
-      description: Map.fetch!(m, "description"),
+      description: decode_description(Map.fetch!(m, "description")),
       files: m["files"]
       |> Map.new(fn {key, value} -> {key, FileValue.from_map(value)} end),
       forks_url: decode_forks_url(m["forks_url"]),
diff --git a/base/elixir/test/inputs/json/misc/80aff.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/80aff.json/default/QuickType.ex
index 24d5912..cd2ef1a 100644
--- a/base/elixir/test/inputs/json/misc/80aff.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/80aff.json/default/QuickType.ex
@@ -90,7 +90,7 @@ defmodule Result do
       id: decode_id(m["id"]),
       items: decode_items(m["items"]),
       name: decode_name(m["name"]),
-      parent: Map.fetch!(m, "parent"),
+      parent: decode_parent(Map.fetch!(m, "parent")),
       updated_at: decode_updated_at(m["updated_at"]),
       uri: decode_uri(m["uri"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/8592b.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/8592b.json/default/QuickType.ex
index 71a635e..99a971e 100644
--- a/base/elixir/test/inputs/json/misc/8592b.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/8592b.json/default/QuickType.ex
@@ -845,8 +845,8 @@ defmodule ChildData do
       approved_by: decode_approved_by(m["approved_by"]),
       archived: decode_archived(m["archived"]),
       author: decode_author(m["author"]),
-      author_flair_css_class: Map.fetch!(m, "author_flair_css_class"),
-      author_flair_text: Map.fetch!(m, "author_flair_text"),
+      author_flair_css_class: decode_author_flair_css_class(Map.fetch!(m, "author_flair_css_class")),
+      author_flair_text: decode_author_flair_text(Map.fetch!(m, "author_flair_text")),
       banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
       banned_by: decode_banned_by(m["banned_by"]),
       brand_safe: decode_brand_safe(m["brand_safe"]),
@@ -888,7 +888,7 @@ defmodule ChildData do
       secure_media: decode_secure_media(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
       selftext: decode_selftext(m["selftext"]),
-      selftext_html: Map.fetch!(m, "selftext_html"),
+      selftext_html: decode_selftext_html(Map.fetch!(m, "selftext_html")),
       spoiler: decode_spoiler(m["spoiler"]),
       stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
@@ -897,8 +897,8 @@ defmodule ChildData do
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
       suggested_sort: SuggestedSort.decode(m["suggested_sort"]),
       thumbnail: decode_thumbnail(m["thumbnail"]),
-      thumbnail_height: Map.fetch!(m, "thumbnail_height"),
-      thumbnail_width: Map.fetch!(m, "thumbnail_width"),
+      thumbnail_height: decode_thumbnail_height(Map.fetch!(m, "thumbnail_height")),
+      thumbnail_width: decode_thumbnail_width(Map.fetch!(m, "thumbnail_width")),
       title: decode_title(m["title"]),
       ups: decode_ups(m["ups"]),
       url: decode_url(m["url"]),
diff --git a/base/elixir/test/inputs/json/misc/996bd.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/996bd.json/default/QuickType.ex
index 66160ac..d37fac8 100644
--- a/base/elixir/test/inputs/json/misc/996bd.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/996bd.json/default/QuickType.ex
@@ -392,7 +392,7 @@ defmodule TopLevelElement do
       links: Enum.map(m["links"], &Link.from_map/1),
       name: decode_name(m["name"]),
       other_names: decode_other_names(m["other_names"]),
-      superseded_by: Map.fetch!(m, "superseded_by"),
+      superseded_by: decode_superseded_by(Map.fetch!(m, "superseded_by")),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/9ac3b.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/9ac3b.json/default/QuickType.ex
index 413c235..d65dc8a 100644
--- a/base/elixir/test/inputs/json/misc/9ac3b.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/9ac3b.json/default/QuickType.ex
@@ -200,7 +200,7 @@ defmodule Result do
       id: decode_id(m["id"]),
       last_name: decode_last_name(m["last_name"]),
       name: decode_name(m["name"]),
-      position: Map.fetch!(m, "position"),
+      position: decode_position(Map.fetch!(m, "position")),
       status: Status.decode(m["status"]),
       title: m["title"] && Title.decode(m["title"]),
       updated_at: decode_updated_at(m["updated_at"]),
diff --git a/base/elixir/test/inputs/json/misc/ad8be.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/ad8be.json/default/QuickType.ex
index 9425aaf..a26c668 100644
--- a/base/elixir/test/inputs/json/misc/ad8be.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/ad8be.json/default/QuickType.ex
@@ -260,7 +260,7 @@ defmodule OtherName do
   def from_map(m) do
     %OtherName{
       name: decode_name(m["name"]),
-      note: Map.fetch!(m, "note"),
+      note: decode_note(Map.fetch!(m, "note")),
     }
   end
 
@@ -488,7 +488,7 @@ defmodule TopLevelElement do
       links: Enum.map(m["links"], &Link.from_map/1),
       name: decode_name(m["name"]),
       other_names: Enum.map(m["other_names"], &OtherName.from_map/1),
-      superseded_by: Map.fetch!(m, "superseded_by"),
+      superseded_by: decode_superseded_by(Map.fetch!(m, "superseded_by")),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/ae7f0.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/ae7f0.json/default/QuickType.ex
index 06dc563..9c338eb 100644
--- a/base/elixir/test/inputs/json/misc/ae7f0.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/ae7f0.json/default/QuickType.ex
@@ -664,8 +664,8 @@ defmodule ChildData do
       is_self: decode_is_self(m["is_self"]),
       is_video: decode_is_video(m["is_video"]),
       likes: decode_likes(m["likes"]),
-      link_flair_css_class: Map.fetch!(m, "link_flair_css_class"),
-      link_flair_text: Map.fetch!(m, "link_flair_text"),
+      link_flair_css_class: decode_link_flair_css_class(Map.fetch!(m, "link_flair_css_class")),
+      link_flair_text: decode_link_flair_text(Map.fetch!(m, "link_flair_text")),
       locked: decode_locked(m["locked"]),
       media: decode_media(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
diff --git a/base/elixir/test/inputs/json/misc/af2d1.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/af2d1.json/default/QuickType.ex
index 6f929ca..b5684cf 100644
--- a/base/elixir/test/inputs/json/misc/af2d1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/af2d1.json/default/QuickType.ex
@@ -737,16 +737,16 @@ defmodule FeatureProperties do
       add_improv: m["add_improv"] && AddImprov.decode(m["add_improv"]),
       area: decode_area(m["area_"]),
       asset_numb: decode_asset_numb(m["asset_numb"]),
-      comments: Map.fetch!(m, "comments"),
+      comments: decode_comments(Map.fetch!(m, "comments")),
       condition: decode_condition(m["condition"]),
-      constructi: Map.fetch!(m, "constructi"),
+      constructi: decode_constructi(Map.fetch!(m, "constructi")),
       createdate: decode_createdate(m["createdate"]),
       createuser: decode_createuser(m["createuser"]),
       disposal_d: decode_disposal_d(m["disposal_d"]),
       documents: decode_documents(m["documents"]),
-      drawing_nu: Map.fetch!(m, "drawing_nu"),
-      file_numbe: Map.fetch!(m, "file_numbe"),
-      folder_num: Map.fetch!(m, "folder_num"),
+      drawing_nu: decode_drawing_nu(Map.fetch!(m, "drawing_nu")),
+      file_numbe: decode_file_numbe(Map.fetch!(m, "file_numbe")),
+      folder_num: decode_folder_num(Map.fetch!(m, "folder_num")),
       funding_ba: m["funding_ba"] && FundingBa.decode(m["funding_ba"]),
       historic_c: decode_historic_c(m["historic_c"]),
       inspection: decode_inspection(m["inspection"]),
@@ -757,11 +757,11 @@ defmodule FeatureProperties do
       mi_prinx: decode_mi_prinx(m["mi_prinx"]),
       mi_symbolo: MiSymbolo.decode(m["mi_symbolo"]),
       number_lan: decode_number_lan(m["number_lan"]),
-      owner: Map.fetch!(m, "owner"),
+      owner: decode_owner(Map.fetch!(m, "owner")),
       positional: m["positional"] && LevelAccu.decode(m["positional"]),
-      project_nu: Map.fetch!(m, "project_nu"),
+      project_nu: decode_project_nu(Map.fetch!(m, "project_nu")),
       rec_id: decode_rec_id(m["rec_id"]),
-      record_cre: Map.fetch!(m, "record_cre"),
+      record_cre: decode_record_cre(Map.fetch!(m, "record_cre")),
       shape_area: decode_shape_area(m["shape_area"]),
       shape_leng: decode_shape_leng(m["shape_leng"]),
       status: Status.decode(m["status"]),
diff --git a/base/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex
index 5949263..3ceec4f 100644
--- a/base/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex
@@ -1120,7 +1120,7 @@ defmodule ChildData do
       archived: decode_archived(m["archived"]),
       author: decode_author(m["author"]),
       author_flair_css_class: decode_author_flair_css_class(m["author_flair_css_class"]),
-      author_flair_text: Map.fetch!(m, "author_flair_text"),
+      author_flair_text: decode_author_flair_text(Map.fetch!(m, "author_flair_text")),
       banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
       banned_by: decode_banned_by(m["banned_by"]),
       brand_safe: decode_brand_safe(m["brand_safe"]),
@@ -1130,7 +1130,7 @@ defmodule ChildData do
       contest_mode: decode_contest_mode(m["contest_mode"]),
       created: decode_created(m["created"]),
       created_utc: decode_created_utc(m["created_utc"]),
-      distinguished: Map.fetch!(m, "distinguished"),
+      distinguished: decode_distinguished(Map.fetch!(m, "distinguished")),
       domain: Domain.decode(m["domain"]),
       downs: decode_downs(m["downs"]),
       edited: decode_edited(m["edited"]),
diff --git a/base/elixir/test/inputs/json/misc/d23d5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/d23d5.json/default/QuickType.ex
index 4bb8768..dc8fd30 100644
--- a/base/elixir/test/inputs/json/misc/d23d5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/d23d5.json/default/QuickType.ex
@@ -79,7 +79,7 @@ defmodule Result do
 
   def from_map(m) do
     %Result{
-      acronym: Map.fetch!(m, "acronym"),
+      acronym: decode_acronym(Map.fetch!(m, "acronym")),
       created_at: decode_created_at(m["created_at"]),
       id: decode_id(m["id"]),
       name: decode_name(m["name"]),
diff --git a/base/elixir/test/inputs/json/misc/f22f5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/f22f5.json/default/QuickType.ex
index 51f4559..cbbf3ac 100644
--- a/base/elixir/test/inputs/json/misc/f22f5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/f22f5.json/default/QuickType.ex
@@ -625,8 +625,8 @@ defmodule ChildData do
       is_self: decode_is_self(m["is_self"]),
       is_video: decode_is_video(m["is_video"]),
       likes: decode_likes(m["likes"]),
-      link_flair_css_class: Map.fetch!(m, "link_flair_css_class"),
-      link_flair_text: Map.fetch!(m, "link_flair_text"),
+      link_flair_css_class: decode_link_flair_css_class(Map.fetch!(m, "link_flair_css_class")),
+      link_flair_text: decode_link_flair_text(Map.fetch!(m, "link_flair_text")),
       locked: decode_locked(m["locked"]),
       media: decode_media(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
diff --git a/base/elixir/test/inputs/json/priority/bug2590.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug2590.json/default/QuickType.ex
index cc360f3..d2fb501 100644
--- a/base/elixir/test/inputs/json/priority/bug2590.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug2590.json/default/QuickType.ex
@@ -23,8 +23,8 @@ defmodule Invoice do
 
   def from_map(m) do
     %Invoice{
-      created_at: Map.fetch!(m, "createdAt"),
-      due_date: Map.fetch!(m, "dueDate"),
+      created_at: decode_created_at(Map.fetch!(m, "createdAt")),
+      due_date: decode_due_date(Map.fetch!(m, "dueDate")),
       name: decode_name(m["name"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex
index 2578a48..6de7375 100644
--- a/base/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex
@@ -1347,7 +1347,7 @@ defmodule Pl do
       s_free_throws_attempted: decode_s_free_throws_attempted(m["sFreeThrowsAttempted"]),
       s_free_throws_made: decode_s_free_throws_made(m["sFreeThrowsMade"]),
       s_free_throws_percentage: decode_s_free_throws_percentage(m["sFreeThrowsPercentage"]),
-      s_minutes: Map.fetch!(m, "sMinutes"),
+      s_minutes: decode_s_minutes(Map.fetch!(m, "sMinutes")),
       s_plus_minus_points: decode_s_plus_minus_points(m["sPlusMinusPoints"]),
       s_points: decode_s_points(m["sPoints"]),
       s_points_fast_break: decode_s_points_fast_break(m["sPointsFastBreak"]),
diff --git a/base/elixir/test/inputs/json/priority/optional-union.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/optional-union.json/default/QuickType.ex
index ad24bc5..2f8a21c 100644
--- a/base/elixir/test/inputs/json/priority/optional-union.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/optional-union.json/default/QuickType.ex
@@ -14,7 +14,7 @@ defmodule TopLevelElement do
 
   def from_map(m) do
     %TopLevelElement{
-      a: m["a"],
+      a: m["a"] && decode_a(m["a"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex
index 1b3e6b2..ecbc016 100644
--- a/base/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex
@@ -701,7 +701,7 @@ defmodule Milestone do
       created_at: decode_created_at(m["created_at"]),
       creator: User.from_map(m["creator"]),
       description: decode_description(m["description"]),
-      due_on: Map.fetch!(m, "due_on"),
+      due_on: decode_due_on(Map.fetch!(m, "due_on")),
       html_url: decode_html_url(m["html_url"]),
       id: decode_id(m["id"]),
       labels_url: decode_labels_url(m["labels_url"]),
@@ -955,7 +955,7 @@ defmodule Issue do
       assignee: decode_assignee(m["assignee"]),
       assignees: decode_assignees(m["assignees"]),
       body: decode_body(m["body"]),
-      closed_at: Map.fetch!(m, "closed_at"),
+      closed_at: decode_closed_at(Map.fetch!(m, "closed_at")),
       comments: decode_comments(m["comments"]),
       comments_url: decode_comments_url(m["comments_url"]),
       created_at: decode_created_at(m["created_at"]),
diff --git a/base/elixir/test/inputs/json/samples/kitchen-sink.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/kitchen-sink.json/default/QuickType.ex
index 0a73a87..0224824 100644
--- a/base/elixir/test/inputs/json/samples/kitchen-sink.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/kitchen-sink.json/default/QuickType.ex
@@ -62,7 +62,7 @@ defmodule PersonElement do
 
   def from_map(m) do
     %PersonElement{
-      int_or_string: Map.fetch!(m, "intOrString"),
+      int_or_string: decode_int_or_string(Map.fetch!(m, "intOrString")),
       name: decode_name(m["name"]),
       optional_value: m["optionalValue"],
     }
diff --git a/base/elixir/test/inputs/json/samples/null-safe.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/null-safe.json/default/QuickType.ex
index 2cf6821..a56b9b1 100644
--- a/base/elixir/test/inputs/json/samples/null-safe.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/null-safe.json/default/QuickType.ex
@@ -84,7 +84,7 @@ defmodule Item do
       address: m["address"] && Address.from_map(m["address"]),
       created_at: m["created_at"],
       name: decode_name(m["name"]),
-      sex: Map.fetch!(m, "sex"),
+      sex: decode_sex(Map.fetch!(m, "sex")),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/samples/reddit.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/reddit.json/default/QuickType.ex
index e3a9c35..d141b0b 100644
--- a/base/elixir/test/inputs/json/samples/reddit.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/reddit.json/default/QuickType.ex
@@ -968,8 +968,8 @@ defmodule ChildData do
       approved_by: decode_approved_by(m["approved_by"]),
       archived: decode_archived(m["archived"]),
       author: decode_author(m["author"]),
-      author_flair_css_class: Map.fetch!(m, "author_flair_css_class"),
-      author_flair_text: Map.fetch!(m, "author_flair_text"),
+      author_flair_css_class: decode_author_flair_css_class(Map.fetch!(m, "author_flair_css_class")),
+      author_flair_text: decode_author_flair_text(Map.fetch!(m, "author_flair_text")),
       banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
       banned_by: decode_banned_by(m["banned_by"]),
       brand_safe: decode_brand_safe(m["brand_safe"]),
@@ -979,7 +979,7 @@ defmodule ChildData do
       contest_mode: decode_contest_mode(m["contest_mode"]),
       created: decode_created(m["created"]),
       created_utc: decode_created_utc(m["created_utc"]),
-      distinguished: Map.fetch!(m, "distinguished"),
+      distinguished: decode_distinguished(Map.fetch!(m, "distinguished")),
       domain: Domain.decode(m["domain"]),
       downs: decode_downs(m["downs"]),
       edited: decode_edited(m["edited"]),
@@ -990,8 +990,8 @@ defmodule ChildData do
       is_self: decode_is_self(m["is_self"]),
       is_video: decode_is_video(m["is_video"]),
       likes: decode_likes(m["likes"]),
-      link_flair_css_class: Map.fetch!(m, "link_flair_css_class"),
-      link_flair_text: Map.fetch!(m, "link_flair_text"),
+      link_flair_css_class: decode_link_flair_css_class(Map.fetch!(m, "link_flair_css_class")),
+      link_flair_text: decode_link_flair_text(Map.fetch!(m, "link_flair_text")),
       locked: decode_locked(m["locked"]),
       media: decode_media(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
diff --git a/base/elixir/test/inputs/json/samples/us-senators.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/us-senators.json/default/QuickType.ex
index 7afc185..af0b446 100644
--- a/base/elixir/test/inputs/json/samples/us-senators.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/us-senators.json/default/QuickType.ex
@@ -424,8 +424,8 @@ defmodule Person do
       osid: decode_osid(m["osid"]),
       pvsid: decode_pvsid(m["pvsid"]),
       sortname: decode_sortname(m["sortname"]),
-      twitterid: Map.fetch!(m, "twitterid"),
-      youtubeid: Map.fetch!(m, "youtubeid"),
+      twitterid: decode_twitterid(Map.fetch!(m, "twitterid")),
+      youtubeid: decode_youtubeid(Map.fetch!(m, "youtubeid")),
     }
   end
 
@@ -877,7 +877,7 @@ defmodule Object do
       district: decode_district(m["district"]),
       enddate: decode_enddate(m["enddate"]),
       extra: Extra.from_map(m["extra"]),
-      leadership_title: Map.fetch!(m, "leadership_title"),
+      leadership_title: decode_leadership_title(Map.fetch!(m, "leadership_title")),
       party: Party.decode(m["party"]),
       person: Person.from_map(m["person"]),
       phone: decode_phone(m["phone"]),
diff --git a/base/graphql-elixir/test/inputs/graphql/github1.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github1.graphql/default/QuickType.ex
index 9b1febb..b5e86aa 100644
--- a/base/graphql-elixir/test/inputs/graphql/github1.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github1.graphql/default/QuickType.ex
@@ -23,7 +23,7 @@ defmodule User do
   def from_map(m) do
     %User{
       login: decode_login(m["login"]),
-      real_name: Map.fetch!(m, "realName"),
+      real_name: decode_real_name(Map.fetch!(m, "realName")),
     }
   end
 
diff --git a/base/graphql-elixir/test/inputs/graphql/github4.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github4.graphql/default/QuickType.ex
index f6a49d1..3bafb19 100644
--- a/base/graphql-elixir/test/inputs/graphql/github4.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github4.graphql/default/QuickType.ex
@@ -178,7 +178,7 @@ defmodule User do
   def from_map(m) do
     %User{
       login: decode_login(m["login"]),
-      name: Map.fetch!(m, "name"),
+      name: decode_name(Map.fetch!(m, "name")),
       repository: m["repository"] && Repository.from_map(m["repository"]),
     }
   end
diff --git a/base/graphql-elixir/test/inputs/graphql/github5.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github5.graphql/default/QuickType.ex
index 5325506..238c2a5 100644
--- a/base/graphql-elixir/test/inputs/graphql/github5.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github5.graphql/default/QuickType.ex
@@ -23,7 +23,7 @@ defmodule User do
   def from_map(m) do
     %User{
       login: decode_login(m["login"]),
-      name: m["name"],
+      name: m["name"] && decode_name(m["name"]),
     }
   end
 
diff --git a/base/graphql-elixir/test/inputs/graphql/github9.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github9.graphql/default/QuickType.ex
index fd8f02a..face931 100644
--- a/base/graphql-elixir/test/inputs/graphql/github9.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github9.graphql/default/QuickType.ex
@@ -148,7 +148,7 @@ defmodule AddReactionPayload do
 
   def from_map(m) do
     %AddReactionPayload{
-      client_mutation_id: Map.fetch!(m, "clientMutationId"),
+      client_mutation_id: decode_client_mutation_id(Map.fetch!(m, "clientMutationId")),
       reaction: Reaction.from_map(m["reaction"]),
       subject: Reactable.from_map(m["subject"]),
     }
diff --git a/base/schema-elixir/test/inputs/schema/accessors.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/accessors.schema/default/QuickType.ex
index 6280926..d8a4fcf 100644
--- a/base/schema-elixir/test/inputs/schema/accessors.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/accessors.schema/default/QuickType.ex
@@ -80,7 +80,7 @@ defmodule TopLevel do
       barre: decode_barre(m["bar"]),
       enumerification: EnumEnum.decode(m["enum"]),
       foo: decode_foo(m["foo"]),
-      unionization: Map.fetch!(m, "union"),
+      unionization: decode_unionization(Map.fetch!(m, "union")),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/bool-string.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/bool-string.schema/default/QuickType.ex
index 63cb009..22289af 100644
--- a/base/schema-elixir/test/inputs/schema/bool-string.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/bool-string.schema/default/QuickType.ex
@@ -37,11 +37,11 @@ defmodule TopLevel do
     %TopLevel{
       arr_nullable: m["arrNullable"] && Enum.map(m["arrNullable"], &decode_arr_nullable_element/1),
       arr_one: m["arrOne"],
-      nullable: Map.fetch!(m, "nullable"),
+      nullable: decode_nullable(Map.fetch!(m, "nullable")),
       one: decode_one(m["one"]),
       optional: m["optional"],
-      union_with_bool: Map.fetch!(m, "unionWithBool"),
-      union_with_bool_and_enum: Map.fetch!(m, "unionWithBoolAndEnum"),
+      union_with_bool: decode_union_with_bool(Map.fetch!(m, "unionWithBool")),
+      union_with_bool_and_enum: decode_union_with_bool_and_enum(Map.fetch!(m, "unionWithBoolAndEnum")),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/class-map-union.schema/default/QuickType.ex b/base/schema-elixir/test/inputs/schema/class-map-union.schema/default/QuickType.ex
deleted file mode 100644
index fd71797..0000000
--- a/base/schema-elixir/test/inputs/schema/class-map-union.schema/default/QuickType.ex
+++ /dev/null
@@ -1,86 +0,0 @@
-# This file was autogenerated using quicktype https://github.com/quicktype/quicktype
-#
-# Add Jason to your mix.exs
-#
-# Decode a JSON string: TopLevel.from_json(data)
-# Encode into a JSON string: TopLevel.to_json(struct)
-
-defmodule UnionClass do
-  defstruct [:quux]
-
-  @type t :: %__MODULE__{
-          quux: integer() | nil
-        }
-
-  def from_map(m) do
-    %UnionClass{
-      quux: m["quux"],
-    }
-  end
-
-  def from_json(json) do
-    json
-          |> Jason.decode!()
-          |> from_map()
-  end
-
-  def to_map(struct) do
-    %{
-      "quux" => struct.quux,
-    }
-  end
-
-  def to_json(struct) do
-    struct
-          |> to_map()
-          |> Jason.encode!()
-  end
-end
-
-defmodule TopLevel do
-  defstruct [:union]
-
-  @type t :: %__MODULE__{
-          union: %{String.t() => boolean() | UnionClass.t() | float() | String.t()} | nil
-        }
-
-  def decode_union_value(%{} = value), do: UnionClass.from_map(value)
-  def decode_union_value(value) when is_boolean(value), do: value
-  def decode_union_value(value) when is_float(value), do: value
-  def decode_union_value(value) when is_integer(value), do: value
-  def decode_union_value(value) when is_binary(value), do: value
-  def decode_union_value(_), do: {:error, "Unexpected type when decoding TopLevel.union"}
-
-  def encode_union_value(%UnionClass{} = value), do: UnionClass.to_map(value)
-  def encode_union_value(value) when is_boolean(value), do: value
-  def encode_union_value(value) when is_float(value), do: value
-  def encode_union_value(value) when is_integer(value), do: value
-  def encode_union_value(value) when is_binary(value), do: value
-  def encode_union_value(_), do: {:error, "Unexpected type when encoding TopLevel.union"}
-
-  def from_map(m) do
-    %TopLevel{
-      union: m["union"]
-      |> Map.new(fn {key, value} -> {key, decode_union_value(value)} end),
-    }
-  end
-
-  def from_json(json) do
-    json
-          |> Jason.decode!()
-          |> from_map()
-  end
-
-  def to_map(struct) do
-    %{
-      "union" => struct.union
-      |> Map.new(fn {key, value} -> {key, encode_union_value(value)} end),
-    }
-  end
-
-  def to_json(struct) do
-    struct
-          |> to_map()
-          |> Jason.encode!()
-  end
-end
diff --git a/base/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex
index 9f4fd44..3dc2c7d 100644
--- a/base/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex
@@ -133,7 +133,7 @@ defmodule TopLevel do
       enum: EnumEnum.decode(m["enum"]),
       foo: m["foo"],
       object_or_string: decode_object_or_string(m["object-or-string"]),
-      union: Map.fetch!(m, "union"),
+      union: decode_union(Map.fetch!(m, "union")),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/implicit-class-array-union.schema/default/QuickType.ex b/base/schema-elixir/test/inputs/schema/implicit-class-array-union.schema/default/QuickType.ex
deleted file mode 100644
index c6dedb0..0000000
--- a/base/schema-elixir/test/inputs/schema/implicit-class-array-union.schema/default/QuickType.ex
+++ /dev/null
@@ -1,96 +0,0 @@
-# This file was autogenerated using quicktype https://github.com/quicktype/quicktype
-#
-# Add Jason to your mix.exs
-#
-# Decode a JSON string: TopLevel.from_json(data)
-# Encode into a JSON string: TopLevel.to_json(struct)
-
-defmodule FooClass do
-  @enforce_keys [:bar]
-  defstruct [:bar]
-
-  @type t :: %__MODULE__{
-          bar: integer()
-        }
-
-  def decode_bar(value) when is_integer(value), do: value
-  def decode_bar(_), do: {:error, "Unexpected type when decoding FooClass.bar"}
-
-  def encode_bar(value) when is_integer(value), do: value
-  def encode_bar(_), do: {:error, "Unexpected type when encoding FooClass.bar"}
-
-  def from_map(m) do
-    %FooClass{
-      bar: decode_bar(m["bar"]),
-    }
-  end
-
-  def from_json(json) do
-    json
-          |> Jason.decode!()
-          |> from_map()
-  end
-
-  def to_map(struct) do
-    %{
-      "bar" => struct.bar,
-    }
-  end
-
-  def to_json(struct) do
-    struct
-          |> to_map()
-          |> Jason.encode!()
-  end
-end
-
-defmodule TopLevel do
-  @enforce_keys [:foo]
-  defstruct [:foo]
-
-  @type t :: %__MODULE__{
-          foo: [integer()] | boolean() | FooClass.t() | float() | integer() | nil | String.t()
-        }
-
-  def decode_foo(%{"bar" => _,} = value), do: FooClass.from_map(value)
-  def decode_foo(value) when is_boolean(value), do: value
-  def decode_foo(value) when is_float(value), do: value
-  def decode_foo(value) when is_integer(value), do: value
-  def decode_foo(value) when is_nil(value), do: value
-  def decode_foo(value) when is_binary(value), do: value
-  def decode_foo(value) when is_list(value), do: value
-  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
-
-  def encode_foo(%FooClass{} = value), do: FooClass.to_map(value)
-  def encode_foo(value) when is_boolean(value), do: value
-  def encode_foo(value) when is_float(value), do: value
-  def encode_foo(value) when is_integer(value), do: value
-  def encode_foo(value) when is_nil(value), do: value
-  def encode_foo(value) when is_binary(value), do: value
-  def encode_foo(value) when is_list(value), do: value
-  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
-
-  def from_map(m) do
-    %TopLevel{
-      foo: decode_foo(m["foo"]),
-    }
-  end
-
-  def from_json(json) do
-    json
-          |> Jason.decode!()
-          |> from_map()
-  end
-
-  def to_map(struct) do
-    %{
-      "foo" => encode_foo(struct.foo),
-    }
-  end
-
-  def to_json(struct) do
-    struct
-          |> to_map()
-          |> Jason.encode!()
-  end
-end
diff --git a/base/schema-elixir/test/inputs/schema/integer-string.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/integer-string.schema/default/QuickType.ex
index c5b4a64..be48f12 100644
--- a/base/schema-elixir/test/inputs/schema/integer-string.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/integer-string.schema/default/QuickType.ex
@@ -37,11 +37,11 @@ defmodule TopLevel do
     %TopLevel{
       arr_nullable: m["arrNullable"] && Enum.map(m["arrNullable"], &decode_arr_nullable_element/1),
       arr_one: m["arrOne"],
-      nullable: Map.fetch!(m, "nullable"),
+      nullable: decode_nullable(Map.fetch!(m, "nullable")),
       one: decode_one(m["one"]),
       optional: m["optional"],
-      union_with_int: Map.fetch!(m, "unionWithInt"),
-      union_with_int_and_enum: Map.fetch!(m, "unionWithIntAndEnum"),
+      union_with_int: decode_union_with_int(Map.fetch!(m, "unionWithInt")),
+      union_with_int_and_enum: decode_union_with_int_and_enum(Map.fetch!(m, "unionWithIntAndEnum")),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/minmaxlength.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/minmaxlength.schema/default/QuickType.ex
index 07bbd65..a39aff5 100644
--- a/base/schema-elixir/test/inputs/schema/minmaxlength.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/minmaxlength.schema/default/QuickType.ex
@@ -65,7 +65,7 @@ defmodule TopLevel do
   def from_map(m) do
     %TopLevel{
       intersection: decode_intersection(m["intersection"]),
-      in_union: Map.fetch!(m, "inUnion"),
+      in_union: decode_in_union(Map.fetch!(m, "inUnion")),
       maxlength: decode_maxlength(m["maxlength"]),
       minlength: decode_minlength(m["minlength"]),
       min_max_intersection: decode_min_max_intersection(m["minMaxIntersection"]),
diff --git a/base/schema-elixir/test/inputs/schema/nullable-optional-one-of.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/nullable-optional-one-of.schema/default/QuickType.ex
index 64df667..96ad9a1 100644
--- a/base/schema-elixir/test/inputs/schema/nullable-optional-one-of.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/nullable-optional-one-of.schema/default/QuickType.ex
@@ -62,7 +62,7 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      b: m["b"],
+      b: m["b"] && decode_b(m["b"]),
       kind: Kind.decode(m["kind"]),
     }
   end
diff --git a/base/schema-elixir/test/inputs/schema/strict-optional.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/strict-optional.schema/default/QuickType.ex
index 0961fd1..321f8f5 100644
--- a/base/schema-elixir/test/inputs/schema/strict-optional.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/strict-optional.schema/default/QuickType.ex
@@ -15,7 +15,7 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      foo: Map.fetch!(m, "foo"),
+      foo: decode_foo(Map.fetch!(m, "foo")),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/union-int-double.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/union-int-double.schema/default/QuickType.ex
index bf1832c..4f2a3a2 100644
--- a/base/schema-elixir/test/inputs/schema/union-int-double.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/union-int-double.schema/default/QuickType.ex
@@ -15,7 +15,7 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      value: Map.fetch!(m, "value"),
+      value: decode_value(Map.fetch!(m, "value")),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/uuid.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/uuid.schema/default/QuickType.ex
index 1ea6e51..559cc45 100644
--- a/base/schema-elixir/test/inputs/schema/uuid.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/uuid.schema/default/QuickType.ex
@@ -42,7 +42,7 @@ defmodule TopLevel do
     %TopLevel{
       arr_nullable: m["arrNullable"] && Enum.map(m["arrNullable"], &decode_arr_nullable_element/1),
       arr_one: m["arrOne"],
-      nullable: Map.fetch!(m, "nullable"),
+      nullable: decode_nullable(Map.fetch!(m, "nullable")),
       one: decode_one(m["one"]),
       optional: m["optional"],
       union_with_enum: decode_union_with_enum(m["unionWithEnum"]),
diff --git a/base/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex
index 8a062a7..6c4b1b8 100644
--- a/base/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex
@@ -914,9 +914,9 @@ defmodule AxisConfig do
       grid_opacity: m["gridOpacity"],
       grid_width: m["gridWidth"],
       label_angle: m["labelAngle"],
-      label_bound: m["labelBound"],
+      label_bound: m["labelBound"] && decode_label_bound(m["labelBound"]),
       label_color: m["labelColor"],
-      label_flush: m["labelFlush"],
+      label_flush: m["labelFlush"] && decode_label_flush(m["labelFlush"]),
       label_font: m["labelFont"],
       label_font_size: m["labelFontSize"],
       label_limit: m["labelLimit"],
@@ -937,7 +937,7 @@ defmodule AxisConfig do
       title_color: m["titleColor"],
       title_font: m["titleFont"],
       title_font_size: m["titleFontSize"],
-      title_font_weight: m["titleFontWeight"],
+      title_font_weight: m["titleFontWeight"] && decode_title_font_weight(m["titleFontWeight"]),
       title_limit: m["titleLimit"],
       title_max_length: m["titleMaxLength"],
       title_padding: m["titlePadding"],
@@ -1123,9 +1123,9 @@ defmodule VGAxisConfig do
       grid_opacity: m["gridOpacity"],
       grid_width: m["gridWidth"],
       label_angle: m["labelAngle"],
-      label_bound: m["labelBound"],
+      label_bound: m["labelBound"] && decode_label_bound(m["labelBound"]),
       label_color: m["labelColor"],
-      label_flush: m["labelFlush"],
+      label_flush: m["labelFlush"] && decode_label_flush(m["labelFlush"]),
       label_font: m["labelFont"],
       label_font_size: m["labelFontSize"],
       label_limit: m["labelLimit"],
@@ -1145,7 +1145,7 @@ defmodule VGAxisConfig do
       title_color: m["titleColor"],
       title_font: m["titleFont"],
       title_font_size: m["titleFontSize"],
-      title_font_weight: m["titleFontWeight"],
+      title_font_weight: m["titleFontWeight"] && decode_title_font_weight(m["titleFontWeight"]),
       title_limit: m["titleLimit"],
       title_max_length: m["titleMaxLength"],
       title_padding: m["titlePadding"],
@@ -1672,7 +1672,7 @@ defmodule LegendConfig do
       title_color: m["titleColor"],
       title_font: m["titleFont"],
       title_font_size: m["titleFontSize"],
-      title_font_weight: m["titleFontWeight"],
+      title_font_weight: m["titleFontWeight"] && decode_title_font_weight(m["titleFontWeight"]),
       title_limit: m["titleLimit"],
       title_padding: m["titlePadding"],
     }
@@ -2047,7 +2047,7 @@ defmodule ScaleConfig do
       min_size: m["minSize"],
       min_stroke_width: m["minStrokeWidth"],
       point_padding: m["pointPadding"],
-      range_step: m["rangeStep"],
+      range_step: m["rangeStep"] && decode_range_step(m["rangeStep"]),
       round: m["round"],
       text_x_range_step: m["textXRangeStep"],
       use_unaggregated_domain: m["useUnaggregatedDomain"],
@@ -2405,8 +2405,8 @@ defmodule IntervalSelectionConfig do
       mark: m["mark"] && BrushConfig.from_map(m["mark"]),
       on: m["on"],
       resolve: m["resolve"] && SelectionResolution.decode(m["resolve"]),
-      translate: m["translate"],
-      zoom: m["zoom"],
+      translate: m["translate"] && decode_translate(m["translate"]),
+      zoom: m["zoom"] && decode_zoom(m["zoom"]),
     }
   end
 
@@ -2474,7 +2474,7 @@ defmodule MultiSelectionConfig do
       nearest: m["nearest"],
       on: m["on"],
       resolve: m["resolve"] && SelectionResolution.decode(m["resolve"]),
-      toggle: m["toggle"],
+      toggle: m["toggle"] && decode_toggle(m["toggle"]),
     }
   end
 
@@ -4191,11 +4191,11 @@ defmodule DateTimeClass do
   def from_map(m) do
     %DateTimeClass{
       date: m["date"],
-      day: m["day"],
+      day: m["day"] && decode_day(m["day"]),
       hours: m["hours"],
       milliseconds: m["milliseconds"],
       minutes: m["minutes"],
-      month: m["month"],
+      month: m["month"] && decode_month(m["month"]),
       quarter: m["quarter"],
       seconds: m["seconds"],
       utc: m["utc"],
@@ -4512,7 +4512,7 @@ defmodule ConditionalValueDef do
   def from_map(m) do
     %ConditionalValueDef{
       test: decode_test(m["test"]),
-      value: Map.fetch!(m, "value"),
+      value: decode_value(Map.fetch!(m, "value")),
       selection: decode_selection(m["selection"]),
     }
   end
@@ -4724,7 +4724,7 @@ defmodule Legend do
       orient: m["orient"] && LegendOrient.decode(m["orient"]),
       padding: m["padding"],
       tick_count: m["tickCount"],
-      title: m["title"],
+      title: m["title"] && decode_title(m["title"]),
       type: m["type"] && LegendType.decode(m["type"]),
       values: m["values"] && Enum.map(m["values"], &decode_values_element/1),
       zindex: m["zindex"],
@@ -5274,7 +5274,7 @@ defmodule Scale do
       padding_inner: m["paddingInner"],
       padding_outer: m["paddingOuter"],
       range: decode_range(m["range"]),
-      range_step: m["rangeStep"],
+      range_step: m["rangeStep"] && decode_range_step(m["rangeStep"]),
       round: m["round"],
       scheme: decode_scheme(m["scheme"]),
       type: m["type"] && ScaleType.decode(m["type"]),
@@ -5559,7 +5559,7 @@ defmodule ConditionalPredicateMarkPropFieldDefClass do
   def from_map(m) do
     %ConditionalPredicateMarkPropFieldDefClass{
       test: decode_test(m["test"]),
-      value: m["value"],
+      value: m["value"] && decode_value(m["value"]),
       selection: decode_selection(m["selection"]),
       aggregate: m["aggregate"] && AggregateOp.decode(m["aggregate"]),
       bin: decode_bin(m["bin"]),
@@ -5722,7 +5722,7 @@ defmodule MarkPropDefWithCondition do
       sort: decode_sort(m["sort"]),
       time_unit: m["timeUnit"] && TimeUnit.decode(m["timeUnit"]),
       type: m["type"] && Type.decode(m["type"]),
-      value: m["value"],
+      value: m["value"] && decode_value(m["value"]),
     }
   end
 
@@ -5776,7 +5776,7 @@ defmodule Header do
     %Header{
       format: m["format"],
       label_angle: m["labelAngle"],
-      title: m["title"],
+      title: m["title"] && decode_title(m["title"]),
     }
   end
 
@@ -6026,7 +6026,7 @@ defmodule ConditionalPredicateFieldDefClass do
   def from_map(m) do
     %ConditionalPredicateFieldDefClass{
       test: decode_test(m["test"]),
-      value: m["value"],
+      value: m["value"] && decode_value(m["value"]),
       selection: decode_selection(m["selection"]),
       aggregate: m["aggregate"] && AggregateOp.decode(m["aggregate"]),
       bin: decode_bin(m["bin"]),
@@ -6137,7 +6137,7 @@ defmodule DefWithCondition do
       field: decode_field(m["field"]),
       time_unit: m["timeUnit"] && TimeUnit.decode(m["timeUnit"]),
       type: m["type"] && Type.decode(m["type"]),
-      value: m["value"],
+      value: m["value"] && decode_value(m["value"]),
     }
   end
 
@@ -6312,7 +6312,7 @@ defmodule ConditionalPredicateTextFieldDefClass do
   def from_map(m) do
     %ConditionalPredicateTextFieldDefClass{
       test: decode_test(m["test"]),
-      value: m["value"],
+      value: m["value"] && decode_value(m["value"]),
       selection: decode_selection(m["selection"]),
       aggregate: m["aggregate"] && AggregateOp.decode(m["aggregate"]),
       bin: decode_bin(m["bin"]),
@@ -6430,7 +6430,7 @@ defmodule TextDefWithCondition do
       format: m["format"],
       time_unit: m["timeUnit"] && TimeUnit.decode(m["timeUnit"]),
       type: m["type"] && Type.decode(m["type"]),
-      value: m["value"],
+      value: m["value"] && decode_value(m["value"]),
     }
   end
 
@@ -6539,8 +6539,8 @@ defmodule Axis do
       format: m["format"],
       grid: m["grid"],
       label_angle: m["labelAngle"],
-      label_bound: m["labelBound"],
-      label_flush: m["labelFlush"],
+      label_bound: m["labelBound"] && decode_label_bound(m["labelBound"]),
+      label_flush: m["labelFlush"] && decode_label_flush(m["labelFlush"]),
       label_overlap: decode_label_overlap(m["labelOverlap"]),
       label_padding: m["labelPadding"],
       labels: m["labels"],
@@ -6552,7 +6552,7 @@ defmodule Axis do
       tick_count: m["tickCount"],
       ticks: m["ticks"],
       tick_size: m["tickSize"],
-      title: m["title"],
+      title: m["title"] && decode_title(m["title"]),
       title_max_length: m["titleMaxLength"],
       title_padding: m["titlePadding"],
       values: m["values"] && Enum.map(m["values"], &decode_values_element/1),
@@ -6675,7 +6675,7 @@ defmodule XClass do
       stack: m["stack"] && StackOffset.decode(m["stack"]),
       time_unit: m["timeUnit"] && TimeUnit.decode(m["timeUnit"]),
       type: m["type"] && Type.decode(m["type"]),
-      value: m["value"],
+      value: m["value"] && decode_value(m["value"]),
     }
   end
 
@@ -6762,7 +6762,7 @@ defmodule X2Class do
       field: decode_field(m["field"]),
       time_unit: m["timeUnit"] && TimeUnit.decode(m["timeUnit"]),
       type: m["type"] && Type.decode(m["type"]),
-      value: m["value"],
+      value: m["value"] && decode_value(m["value"]),
     }
   end
 
@@ -7720,10 +7720,10 @@ defmodule SelectionDef do
       on: m["on"],
       resolve: m["resolve"] && SelectionResolution.decode(m["resolve"]),
       type: SelectionDefType.decode(m["type"]),
-      toggle: m["toggle"],
+      toggle: m["toggle"] && decode_toggle(m["toggle"]),
       mark: m["mark"] && BrushConfig.from_map(m["mark"]),
-      translate: m["translate"],
-      zoom: m["zoom"],
+      translate: m["translate"] && decode_translate(m["translate"]),
+      zoom: m["zoom"] && decode_zoom(m["zoom"]),
     }
   end
 
