diff --git a/mailman-subscribers3.py b/mailman-subscribers3.py
index f515f3f32ac1f753293ad9f6019b4b6642450007..79615ef830fb080aa43d87569e2cd3d93014080c 100755
--- a/mailman-subscribers3.py
+++ b/mailman-subscribers3.py
@@ -166,6 +166,7 @@ import re
 import string
 import urllib.request, urllib.parse, urllib.error
 import getopt
+import json
 import http.client
 from time import sleep
 from html.parser import HTMLParser
@@ -241,7 +242,7 @@ def main():
     try:
         opts, args = getopt.getopt(sys.argv[1:], "ho:rd:fn:cKu:Uvs",
                 ["help", "output=", "regular", "digest=", "fullnames",
-                 "nomail=", "sympa", "csv", "kv", "url_path=", "unhide", "verbose",
+                 "nomail=", "sympa", "csv", "kv", "json", "url_path=", "unhide", "verbose",
                  "ssl"])
     except:
         usage(2)
@@ -278,6 +279,8 @@ def main():
             kv = True
         if o in ("-c", "--csv"):
             csv = True
+        if o in ("-j", "--json"):
+            jsonoutput = True
         if o in ("-u", "--url_path"):
             url_path = a
         if o in ("-U", "--unhide"):
@@ -382,6 +385,8 @@ or you may need to specify --url_path.
             if verbose and nunhide % 100 == 0:
                 print('.', end=' ', file=sys.stderr)
         email = urllib.parse.unquote(email)
+        if jsonoutput:
+            continue
         if csv:
             print('"%s","%s","%s","%s","%s","%s","%s","%s","%s","%s"'\
                  % (d['_realname'], email, d['_mod'], d['_hide'],
@@ -460,6 +465,9 @@ visibility %s
         else:
             print('%s <%s>' % (d['_realname'], email), file=fp)
 
+    if jsonoutput:
+        print(json.dumps(dict(subscriberlist), indent=4), file=fp)
+
     fp.close()