diff --git a/Sources/OpenAPIRuntime/URICoder/Decoding/URIValueFromNodeDecoder.swift b/Sources/OpenAPIRuntime/URICoder/Decoding/URIValueFromNodeDecoder.swift
index 55982755..e4d60e0b 100644
--- a/Sources/OpenAPIRuntime/URICoder/Decoding/URIValueFromNodeDecoder.swift
+++ b/Sources/OpenAPIRuntime/URICoder/Decoding/URIValueFromNodeDecoder.swift
@@ -82,7 +82,9 @@ final class URIValueFromNodeDecoder {
     /// - Throws: When a decoding error occurs.
     func decodeRootIfPresent<T: Decodable>(_ type: T.Type = T.self) throws -> T? {
         // The root is only nil if the node is empty.
-        if try currentElementAsArray().isEmpty { return nil }
+        if style != .deepObject, try currentElementAsArray().isEmpty {
+            return nil
+        }
         return try decodeRoot(type)
     }
 }
diff --git a/Tests/OpenAPIRuntimeTests/Conversion/Test_Converter+Server.swift b/Tests/OpenAPIRuntimeTests/Conversion/Test_Converter+Server.swift
index b2305a08..16ac7374 100644
--- a/Tests/OpenAPIRuntimeTests/Conversion/Test_Converter+Server.swift
+++ b/Tests/OpenAPIRuntimeTests/Conversion/Test_Converter+Server.swift
@@ -171,6 +171,18 @@ final class Test_ServerConverterExtensions: Test_Runtime {
         XCTAssertEqual(value, ["foo", "bar"])
     }
 
+    func test_getOptionalQueryItemAsURI_deepObject_exploded() throws {
+        let query: Substring = "sort%5Bid%5D=ascending&sort%5Bname%5D=descending"
+        let value: [String: String]? = try converter.getOptionalQueryItemAsURI(
+            in: query,
+            style: .deepObject,
+            explode: true,
+            name: "sort",
+            as: [String: String].self
+        )
+        XCTAssertEqual(value, ["id": "ascending", "name": "descending"])
+    }
+    
     func test_getRequiredQueryItemAsURI_arrayOfStrings() throws {
         let query: Substring = "search=foo&search=bar"
         let value: [String] = try converter.getRequiredQueryItemAsURI(
@@ -195,6 +207,18 @@ final class Test_ServerConverterExtensions: Test_Runtime {
         XCTAssertEqual(value, ["foo", "bar"])
     }
 
+    func test_getRequiredQueryItemAsURI_deepObject_exploded() throws {
+        let query: Substring = "sort%5Bid%5D=ascending&sort%5Bname%5D=descending"
+        let value: [String: String] = try converter.getRequiredQueryItemAsURI(
+            in: query,
+            style: .deepObject,
+            explode: true,
+            name: "sort",
+            as: [String: String].self
+        )
+        XCTAssertEqual(value, ["id": "ascending", "name": "descending"])
+    }
+
     func test_getOptionalQueryItemAsURI_date() throws {
         let query: Substring = "search=\(testDateEscapedString)"
         let value: Date? = try converter.getOptionalQueryItemAsURI(
diff --git a/Tests/OpenAPIRuntimeTests/URICoder/Decoder/Test_URIValueFromNodeDecoder.swift b/Tests/OpenAPIRuntimeTests/URICoder/Decoder/Test_URIValueFromNodeDecoder.swift
index f1236cb9..8bfcf2b5 100644
--- a/Tests/OpenAPIRuntimeTests/URICoder/Decoder/Test_URIValueFromNodeDecoder.swift
+++ b/Tests/OpenAPIRuntimeTests/URICoder/Decoder/Test_URIValueFromNodeDecoder.swift
@@ -35,6 +35,11 @@ final class Test_URIValueFromNodeDecoder: Test_Runtime {
             case blue
         }
 
+        struct SimpleDeepObject: Decodable, Equatable {
+            let id: String
+            let name: String
+        }
+        
         // An empty string.
         try test(["root": [""]], "", key: "root")
 
@@ -88,6 +93,14 @@ final class Test_URIValueFromNodeDecoder: Test_Runtime {
             key: "root"
         )
 
+        try test(
+            ["id": ["ascending"], "name": ["descending"]],
+            SimpleDeepObject(id: "ascending", name: "descending"),
+            key: "sort",
+            style: .deepObject,
+            explode: true
+        )
+        
         func test<T: Decodable & Equatable>(
             _ node: URIParsedNode,
             _ expectedValue: T,