Assert that json can be deserialized
diff --git a/codegen/src/json.rs b/codegen/src/json.rs
index 532260e..d870a64 100644
--- a/codegen/src/json.rs
+++ b/codegen/src/json.rs
@@ -1,7 +1,7 @@
 use crate::types;
 
 use std::collections::BTreeMap;
-use std::fs::File;
+use std::fs::{self, File};
 use std::io::prelude::*;
 use std::path::Path;
 
@@ -14,17 +14,18 @@
 
     let manifest: Manifest = toml::from_str(&s).unwrap();
 
-    let f = ::std::fs::File::create(codegen_root.join("../syn.json")).unwrap();
+    let introspect = Introspect {
+        version: manifest.package.version,
+        types: defs.types.clone(),
+        tokens: defs.tokens.clone(),
+    };
 
-    serde_json::to_writer_pretty(
-        f,
-        &Introspect {
-            version: &manifest.package.version,
-            types: &defs.types,
-            tokens: &defs.tokens,
-        },
-    )
-    .unwrap();
+    let j = serde_json::to_string_pretty(&introspect).unwrap();
+    let check: Introspect = serde_json::from_str(&j).unwrap();
+    assert_eq!(introspect, check);
+
+    let json_path = codegen_root.join("../syn.json");
+    fs::write(json_path, j).unwrap();
 }
 
 #[derive(Debug, Deserialize)]
@@ -37,10 +38,10 @@
     version: String,
 }
 
-#[derive(Debug, Serialize)]
-struct Introspect<'a> {
+#[derive(Debug, PartialEq, Serialize, Deserialize)]
+struct Introspect {
     /// The `syn` version used to generate the introspection file
-    version: &'a str,
-    types: &'a [types::Node],
-    tokens: &'a BTreeMap<String, String>,
+    version: String,
+    types: Vec<types::Node>,
+    tokens: BTreeMap<String, String>,
 }
diff --git a/codegen/src/types.rs b/codegen/src/types.rs
index 58ba448..e593a66 100644
--- a/codegen/src/types.rs
+++ b/codegen/src/types.rs
@@ -4,13 +4,13 @@
 use std::collections::BTreeMap;
 use std::ops;
 
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, PartialEq)]
 pub struct Definitions {
     pub types: Vec<Node>,
     pub tokens: BTreeMap<String, String>,
 }
 
-#[derive(Debug, Clone, Serialize)]
+#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 pub struct Node {
     pub ident: String,
     pub features: Features,
@@ -22,7 +22,7 @@
     pub data: Data,
 }
 
-#[derive(Debug, Clone, Serialize)]
+#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 pub enum Data {
     Private,
     #[serde(rename = "fields")]
@@ -31,13 +31,13 @@
     Enum(Vec<Variant>),
 }
 
-#[derive(Debug, Clone, Serialize)]
+#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 pub struct Variant {
     pub ident: String,
     pub fields: Vec<Type>,
 }
 
-#[derive(Debug, Clone, Serialize)]
+#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 #[serde(rename_all = "lowercase")]
 pub enum Type {
     /// Type defined by `syn`
@@ -65,13 +65,13 @@
     Tuple(Vec<Type>),
 }
 
-#[derive(Debug, Clone, Serialize)]
+#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 pub struct Punctuated {
     pub element: Box<Type>,
     pub punct: String,
 }
 
-#[derive(Debug, Default, Clone, Serialize)]
+#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
 pub struct Features {
     any: Vec<String>,
 }