diff --git a/cli/src/main/java/org/onosproject/cli/net/LeaderCommand.java b/cli/src/main/java/org/onosproject/cli/net/LeaderCommand.java
index c4605fb..a60da76 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LeaderCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LeaderCommand.java
@@ -24,6 +24,10 @@
 import org.onosproject.cluster.Leadership;
 import org.onosproject.cluster.LeadershipService;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+
 /**
  * Prints the leader for every topic.
  */
@@ -33,29 +37,33 @@
 
     private static final String FMT = "%-20s | %-15s | %-6s | %-10s |";
 
-    @Override
-    protected void execute() {
-        LeadershipService leaderService = get(LeadershipService.class);
-        Map<String, Leadership> leaderBoard = leaderService.getLeaderBoard();
+    /**
+     * Compares leaders, sorting by toString() output.
+     */
+    private Comparator<Leadership> leadershipComparator =
+            (e1, e2) -> {
+                if (e1.leader() == null && e2.leader() == null) {
+                    return 0;
+                }
+                if (e1.leader() == null) {
+                    return 1;
+                }
+                if (e2.leader() == null) {
+                    return -1;
+                }
+                return e1.leader().toString().compareTo(e2.leader().toString());
+            };
+
+    /**
+     * Displays text representing the leaders.
+     *
+     * @param leaderBoard map of leaders
+     */
+    private void displayLeaders(Map<String, Leadership> leaderBoard) {
         print("--------------------------------------------------------------");
         print(FMT, "Topic", "Leader", "Epoch", "Elected");
         print("--------------------------------------------------------------");
 
-
-        Comparator<Leadership> leadershipComparator =
-                (e1, e2) -> {
-                    if (e1.leader() == null && e2.leader() == null) {
-                        return 0;
-                    }
-                    if (e1.leader() == null) {
-                        return 1;
-                    }
-                    if (e2.leader() == null) {
-                        return -1;
-                    }
-                    return e1.leader().toString().compareTo(e2.leader().toString());
-                };
-
         leaderBoard.values()
                 .stream()
                 .sorted(leadershipComparator)
@@ -66,4 +74,39 @@
                         Tools.timeAgo(l.electedTime())));
         print("--------------------------------------------------------------");
     }
-}
\ No newline at end of file
+
+    /**
+     * Returns JSON node representing the leaders.
+     *
+     * @param leaderBoard map of leaders
+     */
+    private JsonNode json(Map<String, Leadership> leaderBoard) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.createArrayNode();
+        leaderBoard.values()
+                .stream()
+                .sorted(leadershipComparator)
+                .forEach(l ->
+                        result.add(
+                            mapper.createObjectNode()
+                                .put("topic", l.topic())
+                                .put("leader", l.leader().toString())
+                                .put("epoch", l.epoch())
+                                .put("electedTime", Tools.timeAgo(l.electedTime()))));
+
+        return result;
+    }
+
+
+    @Override
+    protected void execute() {
+        LeadershipService leaderService = get(LeadershipService.class);
+        Map<String, Leadership> leaderBoard = leaderService.getLeaderBoard();
+
+        if (outputJson()) {
+            print("%s", json(leaderBoard));
+        } else {
+            displayLeaders(leaderBoard);
+        }
+    }
+}
