diff --git a/aeson-value-parser.cabal b/aeson-value-parser.cabal
--- a/aeson-value-parser.cabal
+++ b/aeson-value-parser.cabal
@@ -1,5 +1,5 @@
 name: aeson-value-parser
-version: 0.14.1
+version: 0.14.2
 synopsis: An API for parsing "aeson" JSON tree into Haskell types
 description:
 category: Data, JSON, Parsing
diff --git a/library/Aeson/ValueParser.hs b/library/Aeson/ValueParser.hs
--- a/library/Aeson/ValueParser.hs
+++ b/library/Aeson/ValueParser.hs
@@ -20,6 +20,8 @@
   Object,
   field,
   oneOfFields,
+  fieldOr,
+  oneOfFieldsOr,
   fieldMap,
   foldlFields,
   -- * Array parsers
@@ -167,13 +169,23 @@
 field :: Text -> Value a -> Object a
 field key (Value effect) = Object $ ReaderT $ \ object -> except $ case HashMap.lookup key object of
   Just value -> case runExcept (runReaderT effect value) of
-    Left (Error.Error path message) -> Left (Error.Error (key : path) message)
     Right parsedValue -> Right parsedValue
+    Left error -> Left (Error.named key error)
   Nothing -> Left (Error.Error (pure key) "Object contains no such key")
 
 {-# INLINE oneOfFields #-}
 oneOfFields :: [Text] -> Value a -> Object a
 oneOfFields keys valueParser = asum (fmap (flip field valueParser) keys)
+
+fieldOr :: Text -> Value a -> Object a -> Object a
+fieldOr name parser alt =
+  join $ mplus
+    (field name (catchError (fmap pure parser) (pure . throwError . Error.named name)))
+    (pure alt)
+
+oneOfFieldsOr :: [Text] -> Value a -> Object a -> Object a
+oneOfFieldsOr names valueParser objectParser =
+  foldr (\ name -> fieldOr name valueParser) objectParser names
 
 {-# INLINE fieldMap #-}
 fieldMap :: Value a -> Object (HashMap Text a)
