diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.3.2
+
+- FromJSON instances for Spline.
+- FromJSON instances for Key.
+
 ## 0.3.1
 
 - Fixed sampling implementation.
diff --git a/smoothie.cabal b/smoothie.cabal
--- a/smoothie.cabal
+++ b/smoothie.cabal
@@ -1,5 +1,5 @@
 name:                smoothie
-version:             0.3.1
+version:             0.3.2
 synopsis:            Smooth curves via several splines and polynomials.
 description:         This package exports several splines and curves you can use
                      to interpolate points in between.
@@ -23,6 +23,10 @@
   default-extensions:  DeriveFoldable
                      , DeriveFunctor
                      , DeriveTraversable
+                     , FlexibleContexts
+                     , FlexibleInstances
+                     , MultiWayIf
+                     , ScopedTypeVariables
 
   exposed-modules:     Data.Spline
                      , Data.Spline.Curve
@@ -32,6 +36,7 @@
   build-depends:       base   >= 4.7  && < 5.0
                      , linear >= 1.16 && < 1.19
                      , vector >= 0.10 && < 0.11
+                     , aeson  >= 0.9  && < 0.10
 
   hs-source-dirs:      src
 
diff --git a/src/Data/Spline/Curve.hs b/src/Data/Spline/Curve.hs
--- a/src/Data/Spline/Curve.hs
+++ b/src/Data/Spline/Curve.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE OverloadedStrings #-}
+
 -----------------------------------------------------------------------------
 -- |
 -- Copyright   : (C) 2015 Dimitri Sabadie
@@ -22,6 +24,7 @@
   ) where
 
 import Control.Monad ( guard )
+import Data.Aeson
 import Data.List ( sortBy )
 import Data.Ord ( comparing )
 import Data.Spline.Key as X
@@ -39,6 +42,11 @@
     -- |Extract the sampler.
   , splineSampler :: a s -> s
   }
+
+instance (FromJSON (a s), Ord s) => FromJSON ((a s -> s) -> Spline a s) where
+  parseJSON = withObject "spline" $ \o -> do
+    keys <- o .: "keys"
+    pure $ \sampler -> spline sampler keys
 
 -- |Build a 'Spline a s'.
 --
diff --git a/src/Data/Spline/Key.hs b/src/Data/Spline/Key.hs
--- a/src/Data/Spline/Key.hs
+++ b/src/Data/Spline/Key.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE OverloadedStrings #-}
+
 -----------------------------------------------------------------------------
 -- |
 -- Copyright   : (C) 2015 Dimitri Sabadie
@@ -17,6 +19,7 @@
   , normalizeSampling
   ) where
 
+import Data.Aeson
 import Linear
 
 -- |A 'Key' is a point on the spline with extra information added. It can be,
@@ -51,6 +54,21 @@
     Cosine a       -> Cosine (f a)
     CubicHermite a -> CubicHermite (f a)
     Bezier l a r   -> Bezier (f l) (f a) (f r)
+
+instance (FromJSON a) => FromJSON (Key a) where
+  parseJSON = withObject "key" $ \o -> do
+    interpolation :: String <- o .: "interpolation"
+    value <- o .: "value"
+    if
+      | interpolation == "hold"          -> pure (Hold value)
+      | interpolation == "linear"        -> pure (Linear value)
+      | interpolation == "cosine"        -> pure (Cosine value)
+      | interpolation == "cubic-hermite" -> pure (CubicHermite value)
+      | interpolation == "bezier" -> do
+          left <- o .: "left"
+          right <- o .: "right"
+          pure $ Bezier left value right
+      | otherwise                        -> fail "unknown interpolation mode"
 
 -- |Extract the value out of a 'Key'.
 keyValue :: Key a -> a
