diff --git a/aeson-better-errors.cabal b/aeson-better-errors.cabal
--- a/aeson-better-errors.cabal
+++ b/aeson-better-errors.cabal
@@ -1,5 +1,5 @@
 name:                aeson-better-errors
-version:             0.1.0.1
+version:             0.2.0.0
 synopsis:            Better error messages when decoding JSON values.
 license:             MIT
 license-file:        LICENSE
diff --git a/src/Data/Aeson/BetterErrors/Internal.hs b/src/Data/Aeson/BetterErrors/Internal.hs
--- a/src/Data/Aeson/BetterErrors/Internal.hs
+++ b/src/Data/Aeson/BetterErrors/Internal.hs
@@ -160,7 +160,7 @@
 displaySpecifics _ (WrongType t val) =
   [ "Type mismatch:"
   , "Expected a value of type " <> displayJSONType t
-  , "Got: " <> decodeUtf8 (BL.toStrict (A.encode val))
+  , "Got: " <> decodeUtf8 (B.concat (BL.toChunks (A.encode val)))
   ]
 displaySpecifics _ (ExpectedIntegral x) =
   [ "Expected an integral value, got " <> tshow x ]
@@ -307,13 +307,21 @@
   forM xs $ \(i, x) ->
     local (appendPath (ArrayIndex i) . setValue x) p
 
--- | Attempt to parse each property value in the array with the given parser,
+-- | Attempt to parse each property value in the object with the given parser,
 -- and collect the results.
 eachInObject :: Parse err a -> Parse err [(Text, a)]
 eachInObject p = do
   xs <- HashMap.toList <$> asObject
   forM xs $ \(k, x) ->
     (k,) <$> local (appendPath (ObjectKey k) . setValue x) p
+
+-- | Attempt to parse each property in the object: parse the key with the
+-- given validation function, parse the value with the given parser, and
+-- collect the results.
+eachInObjectWithKey :: (Text -> Either err k) -> Parse err a -> Parse err [(k, a)]
+eachInObjectWithKey parseKey parseVal =
+  eachInObject parseVal
+      >>= mapM ((\(k,v) -> liftEither ((,) <$> parseKey k <*> pure v)))
 
 -- | Lifts a function attempting to validate an arbitrary JSON value into a
 -- parser. You should only use this if absolutely necessary; the other
