diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sEndpointsListCommand.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sEndpointsListCommand.java
index 018cfb2..5258c18 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sEndpointsListCommand.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sEndpointsListCommand.java
@@ -15,16 +15,23 @@
  */
 package org.onosproject.k8snetworking.cli;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
 import io.fabric8.kubernetes.api.model.Endpoints;
+import io.fabric8.kubernetes.client.utils.Serialization;
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.k8snetworking.api.K8sEndpointsService;
 
+import java.io.IOException;
 import java.util.Comparator;
 import java.util.List;
 
+import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.prettyJson;
+
 /**
  * Lists kubernetes endpoints.
  */
@@ -42,23 +49,43 @@
         List<Endpoints> endpointses = Lists.newArrayList(service.endpointses());
         endpointses.sort(Comparator.comparing(e -> e.getMetadata().getName()));
 
-        print(FORMAT, "Name", "IP Addresses", "Ports");
+        if (outputJson()) {
+            print("%s", json(endpointses));
+        } else {
+            print(FORMAT, "Name", "IP Addresses", "Ports");
 
-        for (Endpoints endpoints : endpointses) {
+            for (Endpoints endpoints : endpointses) {
 
-            List<String> ips = Lists.newArrayList();
-            List<String> portWithProtocol = Lists.newArrayList();
+                List<String> ips = Lists.newArrayList();
+                List<String> portWithProtocol = Lists.newArrayList();
 
-            endpoints.getSubsets().forEach(e -> {
-                e.getAddresses().forEach(a -> ips.add(a.getIp()));
-                e.getPorts().forEach(p -> portWithProtocol.add(p.getPort() +
-                        PORT_PROTOCOL_SEPARATOR + p.getProtocol()));
-            });
+                endpoints.getSubsets().forEach(e -> {
+                    e.getAddresses().forEach(a -> ips.add(a.getIp()));
+                    e.getPorts().forEach(p -> portWithProtocol.add(p.getPort() +
+                            PORT_PROTOCOL_SEPARATOR + p.getProtocol()));
+                });
 
-            print(FORMAT,
-                    endpoints.getMetadata().getName(),
-                    ips.isEmpty() ? "" : ips,
-                    portWithProtocol.isEmpty() ? "" : portWithProtocol);
+                print(FORMAT,
+                        endpoints.getMetadata().getName(),
+                        ips.isEmpty() ? "" : ips,
+                        portWithProtocol.isEmpty() ? "" : portWithProtocol);
+            }
+        }
+    }
+
+    private String json(List<Endpoints> endpointses) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.createArrayNode();
+        try {
+            for (Endpoints endpoints : endpointses) {
+                ObjectNode json = (ObjectNode) new ObjectMapper()
+                        .readTree(Serialization.asJson(endpoints));
+                result.add(json);
+            }
+            return prettyJson(mapper, result.toString());
+        } catch (IOException e) {
+            log.warn("Failed to parse endpoints's JSON string.");
+            return "";
         }
     }
 }
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sPodListCommand.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sPodListCommand.java
index a144397..7845df1 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sPodListCommand.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sPodListCommand.java
@@ -15,16 +15,23 @@
  */
 package org.onosproject.k8snetworking.cli;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
 import io.fabric8.kubernetes.api.model.Pod;
+import io.fabric8.kubernetes.client.utils.Serialization;
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.k8snetworking.api.K8sPodService;
 
+import java.io.IOException;
 import java.util.Comparator;
 import java.util.List;
 
+import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.prettyJson;
+
 /**
  * Lists kubernetes pods.
  */
@@ -41,19 +48,39 @@
         List<Pod> pods = Lists.newArrayList(service.pods());
         pods.sort(Comparator.comparing(p -> p.getMetadata().getName()));
 
-        print(FORMAT, "Name", "Namespace", "IP Address", "Containers");
+        if (outputJson()) {
+            print("%s", json(pods));
+        } else {
+            print(FORMAT, "Name", "Namespace", "IP Address", "Containers");
 
-        for (Pod pod : pods) {
+            for (Pod pod : pods) {
 
-            List<String> containers = Lists.newArrayList();
+                List<String> containers = Lists.newArrayList();
 
-            pod.getSpec().getContainers().forEach(c -> containers.add(c.getName()));
+                pod.getSpec().getContainers().forEach(c -> containers.add(c.getName()));
 
-            print(FORMAT,
-                    pod.getMetadata().getName(),
-                    pod.getMetadata().getNamespace(),
-                    pod.getStatus().getPodIP(),
-                    containers.isEmpty() ? "" : containers);
+                print(FORMAT,
+                        pod.getMetadata().getName(),
+                        pod.getMetadata().getNamespace(),
+                        pod.getStatus().getPodIP(),
+                        containers.isEmpty() ? "" : containers);
+            }
+        }
+    }
+
+    private String json(List<Pod> pods) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.createArrayNode();
+        try {
+            for (Pod pod : pods) {
+                ObjectNode json = (ObjectNode) new ObjectMapper()
+                        .readTree(Serialization.asJson(pod));
+                result.add(json);
+            }
+            return prettyJson(mapper, result.toString());
+        } catch (IOException e) {
+            log.warn("Failed to parse POD's JSON string.");
+            return "";
         }
     }
 }
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sServiceListCommand.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sServiceListCommand.java
index ade0b01..1d6cf3d 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sServiceListCommand.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sServiceListCommand.java
@@ -15,15 +15,22 @@
  */
 package org.onosproject.k8snetworking.cli;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
+import io.fabric8.kubernetes.client.utils.Serialization;
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.k8snetworking.api.K8sServiceService;
 
+import java.io.IOException;
 import java.util.Comparator;
 import java.util.List;
 
+import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.prettyJson;
+
 /**
  * Lists kubernetes services.
  */
@@ -42,20 +49,40 @@
                 Lists.newArrayList(service.services());
         services.sort(Comparator.comparing(s -> s.getMetadata().getName()));
 
-        print(FORMAT, "Name", "Cluster IP", "Ports");
+        if (outputJson()) {
+            print("%s", json(services));
+        } else {
+            print(FORMAT, "Name", "Cluster IP", "Ports");
 
-        for (io.fabric8.kubernetes.api.model.Service svc : services) {
+            for (io.fabric8.kubernetes.api.model.Service svc : services) {
 
-            List<String> portWithProtocol = Lists.newArrayList();
+                List<String> portWithProtocol = Lists.newArrayList();
 
-            svc.getSpec().getPorts().forEach(p ->
-                    portWithProtocol.add(p.getPort() +
-                    PORT_PROTOCOL_SEPARATOR + p.getProtocol()));
+                svc.getSpec().getPorts().forEach(p ->
+                        portWithProtocol.add(p.getPort() +
+                                PORT_PROTOCOL_SEPARATOR + p.getProtocol()));
 
-            print(FORMAT,
-                    svc.getMetadata().getName(),
-                    svc.getSpec().getClusterIP(),
-                    portWithProtocol.isEmpty() ? "" : portWithProtocol);
+                print(FORMAT,
+                        svc.getMetadata().getName(),
+                        svc.getSpec().getClusterIP(),
+                        portWithProtocol.isEmpty() ? "" : portWithProtocol);
+            }
+        }
+    }
+
+    private String json(List<io.fabric8.kubernetes.api.model.Service> services) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.createArrayNode();
+        try {
+            for (io.fabric8.kubernetes.api.model.Service service : services) {
+                ObjectNode json = (ObjectNode) new ObjectMapper()
+                        .readTree(Serialization.asJson(service));
+                result.add(json);
+            }
+            return prettyJson(mapper, result.toString());
+        } catch (IOException e) {
+            log.warn("Failed to parse service's JSON string.");
+            return "";
         }
     }
 }
