diff --git a/mutalyzer/services/json.py b/mutalyzer/services/json.py
index de28cb83b82ae683247a6f149b0c083d8f754760..6362282c7b40f4d9935b0424aa6c8c96e02eb97a 100644
--- a/mutalyzer/services/json.py
+++ b/mutalyzer/services/json.py
@@ -5,17 +5,14 @@ Mutalyzer web service HTTP/RPC with JSON response payloads.
 
 from spyne.application import Application
 from spyne.protocol.http import HttpRpc
-from spyne.protocol.json import JsonObject
+from spyne.protocol.json import JsonDocument
 
 import mutalyzer
 from mutalyzer.services import rpc
 
 
 # HTTP/RPC application.
-# Output JSON can be made more consise by specifying skip_depth=2 in the
-# JsonObject constructor, but to match the API documentation better (and hence
-# have more predictable behaviour) we leave it out.
 application = Application([rpc.MutalyzerService], tns=mutalyzer.SOAP_NAMESPACE,
-                          in_protocol=HttpRpc(),
-                          out_protocol=JsonObject(),
+                          in_protocol=HttpRpc(validator='soft'),
+                          out_protocol=JsonDocument(),
                           name='Mutalyzer')
diff --git a/mutalyzer/services/rpc.py b/mutalyzer/services/rpc.py
index 80ecfb8184e014817d80ee75cd67b171de947819..3a8b701adfa939cb78b9968447af41c0ac79a956 100644
--- a/mutalyzer/services/rpc.py
+++ b/mutalyzer/services/rpc.py
@@ -5,6 +5,8 @@ Mutalyzer RPC services.
        kind of strictness checks on the input. For example, in
        transcriptInfo, the build argument must really be present. (Hint:
        use __checkBuild.)
+       We should use the built-in validator functionality from Spyne for
+       this.
 """