diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for json-syntax
 
+## 0.2.6.0 -- 2023-07-26
+
+* Add `objectFromList` and `arrayFromList`.
+
 ## 0.2.5.0 -- 2023-07-25
 
 * Add `object(13|14|15|16|17)`.
diff --git a/json-syntax.cabal b/json-syntax.cabal
--- a/json-syntax.cabal
+++ b/json-syntax.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.2
 name: json-syntax
-version: 0.2.5.0
+version: 0.2.6.0
 synopsis: High-performance JSON parser and encoder
 description:
   This library parses JSON into a @Value@ type that is consistent with the
diff --git a/src/Json.hs b/src/Json.hs
--- a/src/Json.hs
+++ b/src/Json.hs
@@ -39,7 +39,10 @@
   , bool
   , text
   , shortText
+    -- * Array Construction
+  , arrayFromList
     -- * Object Construction
+  , objectFromList
   , object1
   , object2
   , object3
@@ -452,6 +455,88 @@
 -- | Infix pattern synonym for 'Member'.
 pattern (:->) :: ShortText -> Value -> Member
 pattern key :-> value = Member{key,value}
+
+-- | Construct a JSON array from a list of JSON values.
+--
+-- Unlike 'objectFromList', this is not currently equipped with a
+-- rewrite rule.
+arrayFromList :: [Value] -> Value
+arrayFromList ms = Array $ PM.smallArrayFromList ms
+
+-- | Construct a JSON object from a list of members.
+--
+-- Note: When the argument is a list literal with 16 or fewer elements,
+-- a rewrite rule transforms this into the appropriate @objectN@ function.
+-- When the argument is not a list literal, this function just calls
+-- @smallArrayFromList@ on the members, which has poor performance.
+objectFromList :: [Member] -> Value
+objectFromList ms = Object $ PM.smallArrayFromList ms
+
+{-# NOINLINE objectFromList #-}
+{-# RULES "objectFromList/1" forall a.
+      objectFromList (a : []) =
+      object1 a
+#-}
+{-# RULES "objectFromList/2" forall a b.
+      objectFromList (a : b : []) =
+      object2 a b
+#-}
+{-# RULES "objectFromList/3" forall a b c.
+      objectFromList (a : b : c : []) =
+      object3 a b c
+#-}
+{-# RULES "objectFromList/4" forall a b c d.
+      objectFromList (a : b : c : d : []) =
+      object4 a b c d
+#-}
+{-# RULES "objectFromList/5" forall a b c d e.
+      objectFromList (a : b : c : d : e : []) =
+      object5 a b c d e
+#-}
+{-# RULES "objectFromList/6" forall a b c d e f.
+      objectFromList (a : b : c : d : e : f : []) =
+      object6 a b c d e f
+#-}
+{-# RULES "objectFromList/7" forall a b c d e f g.
+      objectFromList (a : b : c : d : e : f : g : []) =
+      object7 a b c d e f g
+#-}
+{-# RULES "objectFromList/8" forall a b c d e f g h.
+      objectFromList (a : b : c : d : e : f : g : h : []) =
+      object8 a b c d e f g h
+#-}
+{-# RULES "objectFromList/9" forall a b c d e f g h i.
+      objectFromList (a : b : c : d : e : f : g : h : i : []) =
+      object9 a b c d e f g h i
+#-}
+{-# RULES "objectFromList/10" forall a b c d e f g h i j.
+      objectFromList (a : b : c : d : e : f : g : h : i : j : []) =
+      object10 a b c d e f g h i j
+#-}
+{-# RULES "objectFromList/11" forall a b c d e f g h i j k.
+      objectFromList (a : b : c : d : e : f : g : h : i : j : k : []) =
+      object11 a b c d e f g h i j k
+#-}
+{-# RULES "objectFromList/12" forall a b c d e f g h i j k l.
+      objectFromList (a : b : c : d : e : f : g : h : i : j : k : l : []) =
+      object12 a b c d e f g h i j k l
+#-}
+{-# RULES "objectFromList/13" forall a b c d e f g h i j k l m.
+      objectFromList (a : b : c : d : e : f : g : h : i : j : k : l : m : []) =
+      object13 a b c d e f g h i j k l m
+#-}
+{-# RULES "objectFromList/14" forall a b c d e f g h i j k l m n.
+      objectFromList (a : b : c : d : e : f : g : h : i : j : k : l : m : n : []) =
+      object14 a b c d e f g h i j k l m n
+#-}
+{-# RULES "objectFromList/15" forall a b c d e f g h i j k l m n o.
+      objectFromList (a : b : c : d : e : f : g : h : i : j : k : l : m : n : o : []) =
+      object15 a b c d e f g h i j k l m n o
+#-}
+{-# RULES "objectFromList/16" forall a b c d e f g h i j k l m n o p.
+      objectFromList (a : b : c : d : e : f : g : h : i : j : k : l : m : n : o : p : []) =
+      object16 a b c d e f g h i j k l m n o p
+#-}
 
 -- | Construct a JSON object with one member.
 object1 :: Member -> Value
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -123,6 +123,26 @@
         @=?
         BChunks.concat (Builder.run 4 (J.encode (J.String "It\2019s over now")))
     ]
+  , testGroup "objectFromList"
+    [ THU.testCase "empty object" $
+        J.objectFromList []
+        @=?
+        J.emptyObject
+    , THU.testCase "one member" $
+        J.objectFromList [J.Member {J.key = "one", J.value = J.String "value1"}]
+        @=?
+        J.object1 J.Member {J.key = "one", J.value = J.String "value1"}
+    , THU.testCase "two members" $ do
+        let members = [
+              J.Member {J.key = "1", J.value = J.String "1"},
+              J.Member {J.key = "2", J.value = J.String "2"}
+              ]
+        J.objectFromList members
+        @=?
+        J.object2
+          J.Member {J.key = "1", J.value = J.String "1"}
+          J.Member {J.key = "2", J.value = J.String "2"}
+    ]
   , testGroup "smile-fragment"
     [ THU.testCase "biginteger-65535" $
         let enc = BChunks.concat (Builder.run 128 (Smile.encodeBigInteger 65535))
