You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by je...@apache.org on 2018/04/16 13:43:21 UTC

[geode] branch develop updated: GEODE-5069: Reduce direct exposure of GfJsonObject from CommandResult (#1795)

This is an automated email from the ASF dual-hosted git repository.

jensdeppe pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new b52492c  GEODE-5069: Reduce direct exposure of GfJsonObject from CommandResult (#1795)
b52492c is described below

commit b52492c43de7d220a90c9cd914ef710ab331546e
Author: Jens Deppe <jd...@pivotal.io>
AuthorDate: Mon Apr 16 06:43:13 2018 -0700

    GEODE-5069: Reduce direct exposure of GfJsonObject from CommandResult (#1795)
    
    - Methods getGfJsonObject() and getTableContent() are now private.
    - getContent() is still public but only used by CommandResponseBuilder. This
      will change in subsequent PRs.
---
 .../management/internal/cli/json/GfJsonObject.java | 15 ++++
 .../internal/cli/result/CommandResult.java         | 75 +++++++++++++++--
 .../commands/CreateDefinedIndexesCommandTest.java  |  8 +-
 .../cli/commands/CreateIndexCommandTest.java       | 14 ++--
 .../cli/commands/CreateRegionCommandTest.java      | 22 ++---
 .../cli/commands/DescribeRegionDUnitTest.java      | 66 +++++++--------
 .../cli/commands/DescribeRegionJUnitTest.java      | 56 +++++++------
 .../commands/ListJndiBindingCommandDUnitTest.java  | 16 ++--
 .../cli/commands/ShowMetricsJUnitTest.java         |  6 +-
 .../GfshStatusCommandsIntegrationTest.java         |  8 +-
 .../internal/cli/result/ResultBuilderTest.java     | 93 ++++++++++------------
 .../ClusterConfigImportDUnitTest.java              |  6 +-
 .../security/GfshCommandsSecurityTest.java         | 10 +--
 .../internal/security/MultiGfshDUnitTest.java      |  2 +-
 .../geode/test/junit/rules/GfshCommandRule.java    | 13 ++-
 15 files changed, 235 insertions(+), 175 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/json/GfJsonObject.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/json/GfJsonObject.java
index 900b3e0..78e466f 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/json/GfJsonObject.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/json/GfJsonObject.java
@@ -14,10 +14,12 @@
  */
 package org.apache.geode.management.internal.cli.json;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import org.json.JSONArray;
@@ -307,6 +309,19 @@ public class GfJsonObject {
     }
   }
 
+  public List<String> getArrayValues(String key) {
+    List<String> result = new ArrayList<>();
+    if (jsonObject.has(key)) {
+      JSONArray jsonArray = jsonObject.getJSONArray(key);
+
+      for (int i = 0; i < jsonArray.length(); i++) {
+        result.add(jsonArray.getString(i));
+      }
+    }
+
+    return result;
+  }
+
   private static Object extractInternalForGfJsonOrReturnSame(Object value) {
     Object returnedValue = value;
     if (value instanceof GfJsonObject) {
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/CommandResult.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/CommandResult.java
index f13cfc0..b6e8903 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/CommandResult.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/CommandResult.java
@@ -18,13 +18,16 @@ import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 import java.util.stream.Collectors;
 import java.util.zip.DataFormatException;
 
 import org.apache.logging.log4j.Logger;
 import org.json.JSONArray;
+import org.json.JSONObject;
 
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.cli.Result;
@@ -88,7 +91,7 @@ public class CommandResult implements Result {
     return ResultBuilder.getReadOnlyResultData(resultData);
   }
 
-  GfJsonObject getGfJsonObject() {
+  private GfJsonObject getGfJsonObject() {
     return gfJsonObject;
   }
 
@@ -442,14 +445,74 @@ public class CommandResult implements Result {
     return gfJsonObject.getJSONObject(ResultData.RESULT_CONTENT);
   }
 
+  public String getContentAsString() {
+    return getContent().toString();
+  }
+
+  public String getMessageFromContent() {
+    return getContent().getString("message");
+  }
+
+  public String getValueFromContent(String key) {
+    return getContent().get(key).toString();
+  }
+
+  public List<String> getListFromContent(String key) {
+    return getContent().getArrayValues(key);
+  }
+
+  public List<String> getColumnFromTableContent(String column, int... sectionAndTableIDs) {
+    List<String> ids =
+        Arrays.stream(sectionAndTableIDs).mapToObj(Integer::toString).collect(Collectors.toList());
+    return CommandResult.toList(
+        getTableContent(ids.toArray(new String[0])).getInternalJsonObject().getJSONArray(column));
+  }
+
+  public Map<String, List<String>> getMapFromTableContent(int... sectionAndTableIDs) {
+    Map<String, List<String>> result = new LinkedHashMap<>();
+
+    List<String> ids =
+        Arrays.stream(sectionAndTableIDs).mapToObj(Integer::toString).collect(Collectors.toList());
+    JSONObject table = getTableContent(ids.toArray(new String[0])).getInternalJsonObject();
+    for (String column : table.keySet()) {
+      result.put(column, CommandResult.toList(table.getJSONArray(column)));
+    }
+
+    return result;
+  }
+
+  public Map<String, List<String>> getMapFromTableContent(String... sectionAndTableIDs) {
+    Map<String, List<String>> result = new LinkedHashMap<>();
+
+    JSONObject table = getTableContent(sectionAndTableIDs).getInternalJsonObject();
+    for (String column : table.keySet()) {
+      result.put(column, CommandResult.toList(table.getJSONArray(column)));
+    }
+
+    return result;
+  }
+
+  public Map<String, String> getMapFromSection(String sectionID) {
+    Map<String, String> result = new LinkedHashMap<>();
+    GfJsonObject obj = getContent().getJSONObject("__sections__-" + sectionID);
+
+    Iterator<String> iter = obj.keys();
+    while (iter.hasNext()) {
+      String key = iter.next();
+      result.put(key, obj.getString(key));
+    }
+
+    return result;
+  }
+
   /**
    * The intent is that this method should be able to handle both ResultData as well as
    * CompositeResultData
    *
    * @return the extracted GfJsonObject table
    */
-  public GfJsonObject getTableContent() {
-    return getTableContent(0, 0);
+  private GfJsonObject getTableContent() {
+    return getTableContent("0", "0");
   }
 
   /**
@@ -457,7 +520,7 @@ public class CommandResult implements Result {
    * Some commands, such as 'describe region', may return command results with subsections, however.
    * Include these in order, e.g., getTableContent(sectionIndex, subsectionIndex, tableIndex);
    */
-  public GfJsonObject getTableContent(int... sectionAndTableIDs) {
+  private GfJsonObject getTableContent(String... sectionAndTableIDs) {
     GfJsonObject topLevelContent = getContent();
     // Most common is receiving exactly one section index and one table index.
     // Some results, however, will have subsections before the table listings.
@@ -465,14 +528,14 @@ public class CommandResult implements Result {
 
     GfJsonObject sectionObject = topLevelContent;
     for (int i = 0; i < sectionAndTableIDs.length - 1; i++) {
-      int idx = sectionAndTableIDs[i];
+      String idx = sectionAndTableIDs[i];
       sectionObject = sectionObject.getJSONObject("__sections__-" + idx);
       if (sectionObject == null) {
         return topLevelContent;
       }
     }
 
-    int tableId = sectionAndTableIDs[sectionAndTableIDs.length - 1];
+    String tableId = sectionAndTableIDs[sectionAndTableIDs.length - 1];
     GfJsonObject tableContent = sectionObject.getJSONObject("__tables__-" + tableId);
     if (tableContent == null) {
       return topLevelContent;
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateDefinedIndexesCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateDefinedIndexesCommandTest.java
index 002d254..f03dd9c 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateDefinedIndexesCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateDefinedIndexesCommandTest.java
@@ -69,7 +69,7 @@ public class CreateDefinedIndexesCommandTest {
   public void noDefinitions() throws Exception {
     result = gfshParser.executeCommandWithInstance(command, "create defined indexes");
     assertThat(result.getStatus()).isEqualTo(OK);
-    assertThat(result.getContent().toString()).contains("No indexes defined");
+    assertThat(result.getContentAsString()).contains("No indexes defined");
   }
 
   @Test
@@ -79,7 +79,7 @@ public class CreateDefinedIndexesCommandTest {
     doReturn(Collections.EMPTY_SET).when(command).findMembers(any(), any());
     result = gfshParser.executeCommandWithInstance(command, "create defined indexes");
     assertThat(result.getStatus()).isEqualTo(ERROR);
-    assertThat(result.getContent().toString()).contains("No Members Found");
+    assertThat(result.getContentAsString()).contains("No Members Found");
   }
 
   @Test
@@ -122,7 +122,7 @@ public class CreateDefinedIndexesCommandTest {
     assertThat(result.getStatus()).isEqualTo(OK);
     assertThat(result.failedToPersist()).isFalse();
     verify(command, Mockito.times(1)).persistClusterConfiguration(any(), any());
-    assertThat(result.getContent().toString()).contains("Indexes successfully created");
+    assertThat(result.getContentAsString()).contains("Indexes successfully created");
   }
 
   @Test
@@ -164,6 +164,6 @@ public class CreateDefinedIndexesCommandTest {
     // The command will receive 4 results from 2 members, but we need to persist only 2 (#regions)
     // of them.
     verify(command, Mockito.times(2)).persistClusterConfiguration(any(), any());
-    assertThat(result.getContent().toString()).contains("Indexes successfully created");
+    assertThat(result.getContentAsString()).contains("Indexes successfully created");
   }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommandTest.java
index 5d3950b..132068f 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommandTest.java
@@ -64,14 +64,14 @@ public class CreateIndexCommandTest {
     result = gfshParser.executeCommandWithInstance(command,
         "create index --expression=abc --region=abc");
     assertThat(result.getStatus()).isEqualTo(ERROR);
-    assertThat(result.getContent().toString()).contains("Invalid command");
+    assertThat(result.getContentAsString()).contains("Invalid command");
   }
 
   @Test
   public void missingExpression() throws Exception {
     result = gfshParser.executeCommandWithInstance(command, "create index --name=abc --region=abc");
     assertThat(result.getStatus()).isEqualTo(ERROR);
-    assertThat(result.getContent().toString()).contains("Invalid command");
+    assertThat(result.getContentAsString()).contains("Invalid command");
   }
 
   @Test
@@ -79,7 +79,7 @@ public class CreateIndexCommandTest {
     result =
         gfshParser.executeCommandWithInstance(command, "create index --name=abc --expression=abc");
     assertThat(result.getStatus()).isEqualTo(ERROR);
-    assertThat(result.getContent().toString()).contains("Invalid command");
+    assertThat(result.getContentAsString()).contains("Invalid command");
   }
 
   @Test
@@ -87,7 +87,7 @@ public class CreateIndexCommandTest {
     result = gfshParser.executeCommandWithInstance(command,
         "create index --name=abc --expression=abc --region=abc --type=abc");
     assertThat(result.getStatus()).isEqualTo(ERROR);
-    assertThat(result.getContent().toString()).contains("Invalid command");
+    assertThat(result.getContentAsString()).contains("Invalid command");
   }
 
   @Test
@@ -96,7 +96,7 @@ public class CreateIndexCommandTest {
     result = gfshParser.executeCommandWithInstance(command,
         "create index --name=abc --expression=abc --region=abc --type=range");
     assertThat(result.getStatus()).isEqualTo(ERROR);
-    assertThat(result.getContent().toString()).contains("No Members Found");
+    assertThat(result.getContentAsString()).contains("No Members Found");
   }
 
   @Test
@@ -105,7 +105,7 @@ public class CreateIndexCommandTest {
     result = gfshParser.executeCommandWithInstance(command,
         "create index --name=abc --expression=abc --region=abc --type=hash");
     assertThat(result.getStatus()).isEqualTo(ERROR);
-    assertThat(result.getContent().toString()).contains("No Members Found");
+    assertThat(result.getContentAsString()).contains("No Members Found");
   }
 
   @Test
@@ -114,7 +114,7 @@ public class CreateIndexCommandTest {
     result = gfshParser.executeCommandWithInstance(command,
         "create index --name=abc --expression=abc --region=abc");
     assertThat(result.getStatus()).isEqualTo(ERROR);
-    assertThat(result.getContent().toString()).contains("No Members Found");
+    assertThat(result.getContentAsString()).contains("No Members Found");
   }
 
   @Test
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandTest.java
index 089646b..e855b82 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandTest.java
@@ -82,7 +82,7 @@ public class CreateRegionCommandTest {
   public void missingName() throws Exception {
     CommandResult result = parser.executeCommandWithInstance(command, "create region");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString()).contains("Invalid command");
+    assertThat(result.getContentAsString()).contains("Invalid command");
   }
 
   @Test
@@ -90,7 +90,7 @@ public class CreateRegionCommandTest {
     CommandResult result =
         parser.executeCommandWithInstance(command, "create region --name=region");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString())
+    assertThat(result.getContentAsString())
         .contains("One of \\\"type\\\" or \\\"template-region\\\" is required.");
   }
 
@@ -99,7 +99,7 @@ public class CreateRegionCommandTest {
     CommandResult result = parser.executeCommandWithInstance(command,
         "create region --name=region --type=REPLICATE --template-region=regionB");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString())
+    assertThat(result.getContentAsString())
         .contains("Only one of type & template-region can be specified.");
   }
 
@@ -108,7 +108,7 @@ public class CreateRegionCommandTest {
     CommandResult result = parser.executeCommandWithInstance(command,
         "create region --name=region --type=REPLICATE --eviction-action=invalidAction");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString())
+    assertThat(result.getContentAsString())
         .contains("eviction-action must be 'local-destroy' or 'overflow-to-disk'");
   }
 
@@ -117,7 +117,7 @@ public class CreateRegionCommandTest {
     CommandResult result = parser.executeCommandWithInstance(command,
         "create region --name=region --type=REPLICATE --eviction-max-memory=1000 --eviction-entry-count=200");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString())
+    assertThat(result.getContentAsString())
         .contains("eviction-max-memory and eviction-entry-count cannot both be specified.");
   }
 
@@ -126,7 +126,7 @@ public class CreateRegionCommandTest {
     CommandResult result = parser.executeCommandWithInstance(command,
         "create region --name=region --type=REPLICATE --eviction-max-memory=1000");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString()).contains("eviction-action must be specified.");
+    assertThat(result.getContentAsString()).contains("eviction-action must be specified.");
   }
 
   @Test
@@ -134,7 +134,7 @@ public class CreateRegionCommandTest {
     CommandResult result = parser.executeCommandWithInstance(command,
         "create region --name=region --type=REPLICATE --eviction-entry-count=1 --eviction-object-sizer=abc --eviction-action=local-destroy");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString())
+    assertThat(result.getContentAsString())
         .contains("eviction-object-sizer cannot be specified with eviction-entry-count");
   }
 
@@ -147,7 +147,7 @@ public class CreateRegionCommandTest {
     CommandResult result = parser.executeCommandWithInstance(command,
         "create region --name=region --template-region=regionA");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString())
+    assertThat(result.getContentAsString())
         .contains("Could not retrieve region attributes for given path");
   }
 
@@ -330,7 +330,7 @@ public class CreateRegionCommandTest {
     CommandResult result = parser.executeCommandWithInstance(command,
         "create region --name=region --type=REPLICATE --compressor=abc-def");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString()).contains("abc-def is an invalid Compressor.");
+    assertThat(result.getContentAsString()).contains("abc-def is an invalid Compressor.");
   }
 
   @Test
@@ -338,7 +338,7 @@ public class CreateRegionCommandTest {
     CommandResult result = parser.executeCommandWithInstance(command,
         "create region --name=region --type=REPLICATE --key-type=abc-def");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString()).contains("Invalid command");
+    assertThat(result.getContentAsString()).contains("Invalid command");
   }
 
   @Test
@@ -346,7 +346,7 @@ public class CreateRegionCommandTest {
     CommandResult result = parser.executeCommandWithInstance(command,
         "create region --name=region --type=REPLICATE --value-type=abc-def");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString()).contains("Invalid command");
+    assertThat(result.getContentAsString()).contains("Invalid command");
   }
 
   @Test
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeRegionDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeRegionDUnitTest.java
index 1fcacca..99ac56c 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeRegionDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeRegionDUnitTest.java
@@ -19,8 +19,8 @@ import static org.apache.geode.management.internal.cli.i18n.CliStrings.DESCRIBE_
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.List;
+import java.util.Map;
 
-import org.json.JSONObject;
 import org.junit.BeforeClass;
 import org.junit.ClassRule;
 import org.junit.Test;
@@ -38,7 +38,6 @@ import org.apache.geode.cache.RegionFactory;
 import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.compression.SnappyCompressor;
 import org.apache.geode.internal.cache.RegionEntryContext;
-import org.apache.geode.management.internal.cli.json.GfJsonObject;
 import org.apache.geode.management.internal.cli.result.CommandResult;
 import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
 import org.apache.geode.management.internal.cli.util.RegionAttributesNames;
@@ -171,18 +170,16 @@ public class DescribeRegionDUnitTest {
     CommandResult result = gfsh.executeAndAssertThat("describe region --name=" + PR1)
         .statusIsSuccess().getCommandResult();
 
-    JSONObject table = result.getTableContent(0, 0, 0).getInternalJsonObject();
-    List<String> names = CommandResult.toList(table.getJSONArray("Name"));
+    List<String> names = result.getColumnFromTableContent("Name", 0, 0, 0);
     assertThat(names).containsOnlyOnce(RegionAttributesNames.ENTRY_IDLE_TIME_CUSTOM_EXPIRY);
 
-    List<String> values = CommandResult.toList(table.getJSONArray("Value"));
+    List<String> values = result.getColumnFromTableContent("Value", 0, 0, 0);
     assertThat(values).containsOnlyOnce(TestCustomIdleExpiry.class.getName());
 
-    table = result.getTableContent(0, 1, 0).getInternalJsonObject();
-    names = CommandResult.toList(table.getJSONArray("Name"));
+    names = result.getColumnFromTableContent("Name", 0, 1, 0);
     assertThat(names).containsOnlyOnce(RegionAttributesNames.ENTRY_TIME_TO_LIVE_CUSTOM_EXPIRY);
 
-    values = CommandResult.toList(table.getJSONArray("Value"));
+    values = result.getColumnFromTableContent("Value", 0, 1, 0);
     assertThat(values).containsOnlyOnce(TestCustomTTLExpiry.class.getName());
   }
 
@@ -217,31 +214,29 @@ public class DescribeRegionDUnitTest {
     CommandResult commandResult =
         gfsh.executeAndAssertThat(command).statusIsSuccess().getCommandResult();
 
-    GfJsonObject hostingMembersRegionDesc = getMembersRegionDesc(commandResult, "Hosting Members");
-    GfJsonObject hostingMembersTableContent = hostingMembersRegionDesc
-        .getJSONObject("__sections__-0").getJSONObject("__tables__-0").getJSONObject("content");
-
-    GfJsonObject accessorsRegionDesc = getMembersRegionDesc(commandResult, "Accessor Members");
-    GfJsonObject accessorsTableContent = accessorsRegionDesc.getJSONObject("__sections__-0")
-        .getJSONObject("__tables__-0").getJSONObject("content");
-
-    assertThat(hostingMembersRegionDesc.get("Name").toString())
-        .contains(HOSTING_AND_ACCESSOR_REGION_NAME);
-    assertThat(hostingMembersRegionDesc.get("Data Policy").toString()).contains("partition");
-    assertThat(hostingMembersRegionDesc.get("Hosting Members").toString()).contains("server-1",
-        "server-2", "server-3", "server-4");
-    assertThat(hostingMembersTableContent.get("Type").toString()).contains("Region");
-    assertThat(hostingMembersTableContent.get("Name").toString()).contains("data-policy", "size");
-    assertThat(hostingMembersTableContent.get("Value").toString()).contains("PARTITION", "0");
-
-    assertThat(accessorsRegionDesc.get("Name").toString())
-        .contains(HOSTING_AND_ACCESSOR_REGION_NAME);
-    assertThat(accessorsRegionDesc.get("Data Policy").toString()).contains("partition");
-    assertThat(accessorsRegionDesc.get("Accessor Members").toString()).contains("server-5");
-    assertThat(accessorsTableContent.get("Type").toString()).contains("Region", "Partition");
-    assertThat(accessorsTableContent.get("Name").toString()).contains("data-policy", "size",
+    Map<String, String> hostingMembers = commandResult.getMapFromSection("1");
+    Map<String, List<String>> hostingMembersTable =
+        commandResult.getMapFromTableContent("1", "0", "0");
+
+    assertThat(hostingMembers.get("Name")).isEqualTo(HOSTING_AND_ACCESSOR_REGION_NAME);
+    assertThat(hostingMembers.get("Data Policy")).isEqualTo("partition");
+    assertThat(hostingMembers.get("Hosting Members")).contains("server-1", "server-2", "server-3",
+        "server-4");
+    assertThat(hostingMembersTable.get("Type")).contains("Region");
+    assertThat(hostingMembersTable.get("Name")).contains("data-policy", "size");
+    assertThat(hostingMembersTable.get("Value")).contains("PARTITION", "0");
+
+    Map<String, String> accessorMembers = commandResult.getMapFromSection("0");
+    Map<String, List<String>> accessorMembersTable =
+        commandResult.getMapFromTableContent("0", "0", "0");
+
+    assertThat(accessorMembers.get("Name")).isEqualTo(HOSTING_AND_ACCESSOR_REGION_NAME);
+    assertThat(accessorMembers.get("Data Policy")).isEqualTo("partition");
+    assertThat(accessorMembers.get("Accessor Members")).isEqualTo("server-5");
+    assertThat(accessorMembersTable.get("Type")).contains("Region", "Partition");
+    assertThat(accessorMembersTable.get("Name")).contains("data-policy", "size",
         "local-max-memory");
-    assertThat(accessorsTableContent.get("Value").toString()).contains("PARTITION", "0", "0");
+    assertThat(accessorMembersTable.get("Value")).contains("PARTITION", "0", "0");
   }
 
   private static void createHostingAndAccessorRegion() {
@@ -257,13 +252,6 @@ public class DescribeRegionDUnitTest {
     });
   }
 
-  private GfJsonObject getMembersRegionDesc(CommandResult commandResult, String memberType) {
-    if (commandResult.getContent().getJSONObject("__sections__-0").has(memberType))
-      return commandResult.getContent().getJSONObject("__sections__-0");
-    else
-      return commandResult.getContent().getJSONObject("__sections__-1");
-  }
-
   private static void createLocalRegion(final String regionName) {
     final Cache cache = CacheFactory.getAnyInstance();
     // Create the data region
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeRegionJUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeRegionJUnitTest.java
index 0faca89..7fb985a 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeRegionJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeRegionJUnitTest.java
@@ -36,8 +36,6 @@ import org.junit.experimental.categories.Category;
 
 import org.apache.geode.management.internal.cli.GfshParseResult;
 import org.apache.geode.management.internal.cli.domain.RegionDescriptionPerMember;
-import org.apache.geode.management.internal.cli.json.GfJsonObject;
-import org.apache.geode.management.internal.cli.result.CommandResult;
 import org.apache.geode.test.junit.assertions.CommandResultAssert;
 import org.apache.geode.test.junit.categories.UnitTest;
 import org.apache.geode.test.junit.rules.GfshParserRule;
@@ -104,12 +102,14 @@ public class DescribeRegionJUnitTest {
         gfsh.executeAndAssertThat(command, COMMAND + " --name=" + regionName).statusIsSuccess()
             .doesNotContainOutput("Non-Default Attributes Specific To");
 
-    GfJsonObject shared = getSharedAttributedJson(commandAssert.getCommandResult());
-    GfJsonObject unique = getMemberSpecificAttributeJson(commandAssert.getCommandResult());
+    Map<String, List<String>> shared =
+        commandAssert.getCommandResult().getMapFromTableContent(0, 0, 0);
+    Map<String, List<String>> memberSpecific =
+        commandAssert.getCommandResult().getMapFromTableContent(0, 1, 0);
 
-    assertThat(shared.toString()).contains("regKey", "regVal", "evictKey", "evictVal", "partKey",
-        "partVal");
-    assertThat(unique.toString()).isEqualTo("{}");
+    assertThat(shared.get("Name")).contains("regKey", "evictKey", "partKey");
+    assertThat(shared.get("Value")).contains("regVal", "evictVal", "partVal");
+    assertThat(memberSpecific).isEmpty();
   }
 
   @Test
@@ -133,12 +133,14 @@ public class DescribeRegionJUnitTest {
         gfsh.executeAndAssertThat(command, COMMAND + " --name=" + regionName).statusIsSuccess()
             .doesNotContainOutput("Non-Default Attributes Specific To");
 
-    GfJsonObject shared = getSharedAttributedJson(commandAssert.getCommandResult());
-    GfJsonObject unique = getMemberSpecificAttributeJson(commandAssert.getCommandResult());
+    Map<String, List<String>> shared =
+        commandAssert.getCommandResult().getMapFromTableContent(0, 0, 0);
+    Map<String, List<String>> memberSpecific =
+        commandAssert.getCommandResult().getMapFromTableContent(0, 1, 0);
 
-    assertThat(shared.toString()).contains("regKey", "regVal", "evictKey", "evictVal", "partKey",
-        "partVal");
-    assertThat(unique.toString()).isEqualTo("{}");
+    assertThat(shared.get("Name")).contains("regKey", "evictKey", "partKey");
+    assertThat(shared.get("Value")).contains("regVal", "evictVal", "partVal");
+    assertThat(memberSpecific).isEmpty();
   }
 
   @Test
@@ -169,20 +171,22 @@ public class DescribeRegionJUnitTest {
     CommandResultAssert commandAssert =
         gfsh.executeAndAssertThat(command, COMMAND + " --name=" + regionName).statusIsSuccess();
 
-    GfJsonObject shared = getSharedAttributedJson(commandAssert.getCommandResult());
-    GfJsonObject unique = getMemberSpecificAttributeJson(commandAssert.getCommandResult());
-
-    assertThat(shared.toString()).contains("Eviction", "sharedEvictionKey", "sharedEvictionValue");
-    assertThat(unique.toString()).contains("sharedPartitionKey", "uniquePartitionValue_A",
-        "uniqueRegionKey_A", "uniqueRegionValue_A", "sharedPartitionKey", "uniquePartitionValue_B",
-        "uniqueRegionKey_B", "uniqueRegionValue_B");
-  }
-
-  private GfJsonObject getSharedAttributedJson(CommandResult commandResult) {
-    return commandResult.getTableContent(0, 0, 0);
+    Map<String, List<String>> shared =
+        commandAssert.getCommandResult().getMapFromTableContent(0, 0, 0);
+    Map<String, List<String>> memberSpecific =
+        commandAssert.getCommandResult().getMapFromTableContent(0, 1, 0);
+
+    assertThat(shared.get("Type")).containsExactly("Eviction");
+    assertThat(shared.get("Name")).containsExactly("sharedEvictionKey");
+    assertThat(shared.get("Value")).containsExactly("sharedEvictionValue");
+
+    assertThat(memberSpecific.get("Member")).containsExactly("mockA", "", "mockB", "");
+    assertThat(memberSpecific.get("Type")).containsExactly("Region", "Partition", "Region",
+        "Partition");
+    assertThat(memberSpecific.get("Name")).containsExactly("uniqueRegionKey_A",
+        "sharedPartitionKey", "uniqueRegionKey_B", "sharedPartitionKey");
+    assertThat(memberSpecific.get("Value")).containsExactly("uniqueRegionValue_A",
+        "uniquePartitionValue_A", "uniqueRegionValue_B", "uniquePartitionValue_B");
   }
 
-  private GfJsonObject getMemberSpecificAttributeJson(CommandResult commandResult) {
-    return commandResult.getTableContent(0, 1, 0);
-  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommandDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommandDUnitTest.java
index 4037746..2022b70 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommandDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommandDUnitTest.java
@@ -17,6 +17,7 @@ package org.apache.geode.management.internal.cli.commands;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.List;
 import java.util.Properties;
 
 import org.junit.BeforeClass;
@@ -26,9 +27,6 @@ import org.junit.experimental.categories.Category;
 
 import org.apache.geode.distributed.ConfigurationProperties;
 import org.apache.geode.management.internal.cli.functions.ListJndiBindingFunction;
-import org.apache.geode.management.internal.cli.json.GfJsonArray;
-import org.apache.geode.management.internal.cli.json.GfJsonException;
-import org.apache.geode.management.internal.cli.json.GfJsonObject;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.assertions.CommandResultAssert;
@@ -60,7 +58,7 @@ public class ListJndiBindingCommandDUnitTest {
   }
 
   @Test
-  public void listJndiBinding() throws GfJsonException {
+  public void listJndiBinding() {
     gfsh.executeAndAssertThat(
         "create jndi-binding --name=jndi1 --type=SIMPLE --jdbc-driver-class=org.apache.derby.jdbc.EmbeddedDriver --connection-url=\"jdbc:derby:newDB;create=true\"")
         .statusIsSuccess().tableHasColumnOnlyWithValues("Member", "server-1");
@@ -74,10 +72,10 @@ public class ListJndiBindingCommandDUnitTest {
         .tableHasRowCount("Group Name", 1);
 
     // member table
-    GfJsonObject memberTableContent = commandResultAssert.getCommandResult().getTableContent(0, 1);
-    GfJsonArray jndi_names = memberTableContent.getJSONArray("JNDI Name");
-    assertThat(jndi_names.size()).isEqualTo(3);
-    assertThat(GfJsonArray.toStringArray(jndi_names)).containsExactlyInAnyOrder("java:jndi1",
-        "java:UserTransaction", "java:TransactionManager");
+    List<String> jndiNames =
+        commandResultAssert.getCommandResult().getColumnFromTableContent("JNDI Name", 0, 1);
+    assertThat(jndiNames.size()).isEqualTo(3);
+    assertThat(jndiNames).containsExactlyInAnyOrder("java:jndi1", "java:UserTransaction",
+        "java:TransactionManager");
   }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsJUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsJUnitTest.java
index e6f15e4..4a2f0b1 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsJUnitTest.java
@@ -38,7 +38,7 @@ public class ShowMetricsJUnitTest {
     CommandResult result =
         parser.executeCommandWithInstance(command, "show metrics --port=0 --region=regionA");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString())
+    assertThat(result.getContentAsString())
         .contains("The --region and --port parameters are mutually exclusive");
   }
 
@@ -47,7 +47,7 @@ public class ShowMetricsJUnitTest {
     ShowMetricsCommand command = spy(ShowMetricsCommand.class);
     CommandResult result = parser.executeCommandWithInstance(command, "show metrics --port=0");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString()).contains(
+    assertThat(result.getContentAsString()).contains(
         "If the --port parameter is specified, then the --member parameter must also be specified.");
   }
 
@@ -57,6 +57,6 @@ public class ShowMetricsJUnitTest {
     CommandResult result = parser.executeCommandWithInstance(command, "show metrics --port=abc");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
     // When relying on Spring's converters, any command that does not parse is "Invalid"
-    assertThat(result.getContent().toString()).contains("Invalid command");
+    assertThat(result.getContentAsString()).contains("Invalid command");
   }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/lifecycle/GfshStatusCommandsIntegrationTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/lifecycle/GfshStatusCommandsIntegrationTest.java
index ddfa7c0..2570a9a 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/lifecycle/GfshStatusCommandsIntegrationTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/lifecycle/GfshStatusCommandsIntegrationTest.java
@@ -56,14 +56,14 @@ public class GfshStatusCommandsIntegrationTest {
   public void statusLocatorWithBadPortReportsNotResponding() throws Exception {
     CommandResult result = gfsh.executeCommand("status locator --host=localhost --port="
         + String.valueOf(locator.getLocator().getPort() - 1));
-    assertThat(result.getContent().getString("message")).contains("not responding");
+    assertThat(result.getMessageFromContent()).contains("not responding");
   }
 
   @Test
   public void statusLocatorWithActivePortReportsOnline() throws Exception {
     CommandResult result = gfsh.executeCommand(
         "status locator --host=localhost --port=" + String.valueOf(locator.getLocator().getPort()));
-    assertThat(result.getContent().getString("message")).contains("is currently online");
+    assertThat(result.getMessageFromContent()).contains("is currently online");
   }
 
   @Test
@@ -71,7 +71,7 @@ public class GfshStatusCommandsIntegrationTest {
     File serverDir = new File(temporaryFolder.getRoot(), "serverDir");
     serverDir.mkdirs();
     CommandResult result = gfsh.executeCommand("status server");
-    assertThat(result.getContent().getString("message")).contains("not responding");
+    assertThat(result.getMessageFromContent()).contains("not responding");
   }
 
   @Test
@@ -79,6 +79,6 @@ public class GfshStatusCommandsIntegrationTest {
     File serverDir = new File(temporaryFolder.getRoot(), "serverDir");
     serverDir.mkdirs();
     CommandResult result = gfsh.executeCommand("status server --dir=" + serverDir.toString());
-    assertThat(result.getContent().getString("message")).contains("not responding");
+    assertThat(result.getMessageFromContent()).contains("not responding");
   }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/result/ResultBuilderTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/result/ResultBuilderTest.java
index 3b4e371..a70d7d0 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/result/ResultBuilderTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/result/ResultBuilderTest.java
@@ -16,7 +16,9 @@ package org.apache.geode.management.internal.cli.result;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.json.JSONArray;
+import java.util.List;
+import java.util.Map;
+
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
@@ -29,108 +31,99 @@ public class ResultBuilderTest {
   @Test
   public void messageExistsForString() throws Exception {
     CommandResult result = (CommandResult) ResultBuilder.createInfoResult("test message");
-    assertThat(result.getContent().get("message")).isInstanceOf(JSONArray.class);
-    assertThat(result.getContent().get("message").toString()).isEqualTo("[\"test message\"]");
+    assertThat(result.getValueFromContent("message")).isEqualTo("[\"test message\"]");
   }
 
   @Test
   public void messageExistsForEmpty() throws Exception {
     CommandResult result = (CommandResult) ResultBuilder.createInfoResult("");
-    assertThat(result.getContent().get("message")).isInstanceOf(JSONArray.class);
-    assertThat(result.getContent().get("message").toString()).isEqualTo("[\"\"]");
+    assertThat(result.getValueFromContent("message")).isEqualTo("[\"\"]");
 
   }
 
   @Test
   public void messageExistsForNull() throws Exception {
     CommandResult result = (CommandResult) ResultBuilder.createInfoResult(null);
-    assertThat(result.getContent().get("message")).isInstanceOf(JSONArray.class);
-    assertThat(result.getContent().get("message").toString()).isEqualTo("[null]");
+    assertThat(result.getValueFromContent("message")).isEqualTo("[null]");
 
   }
 
   @Test
-  public void infoResultDataStructure() throws Exception {
+  public void infoResultDataStructure() {
     InfoResultData result = ResultBuilder.createInfoResultData();
     result.addLine("line 1");
     result.addLine("line 2");
-    result.setFooter("Feet!");
-    result.setHeader("Header");
-    CommandResult cmdResult = (CommandResult) ResultBuilder.buildResult(result);
-
-    assertThat(cmdResult.getGfJsonObject().has("header")).isTrue();
-    assertThat(cmdResult.getGfJsonObject().has("content")).isTrue();
-    assertThat(cmdResult.getGfJsonObject().has("footer")).isTrue();
-
-    assertThat(cmdResult.getContent().has("message")).isTrue();
-
+    result.setHeader("Heads");
+    result.setFooter("Tails");
+    CommandResult cmdResult = ResultBuilder.buildResult(result);
+
+    assertThat(cmdResult.getHeader()).isEqualTo("Heads");
+    assertThat(cmdResult.getListFromContent("message")).contains("line 1", "line 2");
+    assertThat(cmdResult.getFooter()).isEqualTo("Tails");
+    assertThat(cmdResult.getValueFromContent("message")).isNotEmpty();
     assertThat(cmdResult.getStatus()).isEqualTo(Result.Status.OK);
   }
 
   @Test
-  public void errorResultDataStructure() throws Exception {
+  public void errorResultDataStructure() {
     ErrorResultData result = ResultBuilder.createErrorResultData();
     result.addLine("line 1");
     result.addLine("line 2");
-    result.setFooter("Feet!");
-    result.setHeader("Header");
-    CommandResult cmdResult = (CommandResult) ResultBuilder.buildResult(result);
+    result.setHeader("Heads");
+    result.setFooter("Tails");
+    CommandResult cmdResult = ResultBuilder.buildResult(result);
 
-    assertThat(cmdResult.getGfJsonObject().has("header")).isTrue();
-    assertThat(cmdResult.getGfJsonObject().has("content")).isTrue();
-    assertThat(cmdResult.getGfJsonObject().has("footer")).isTrue();
+    assertThat(cmdResult.getHeader()).isEqualTo("Heads");
+    assertThat(cmdResult.getListFromContent("message")).contains("line 1", "line 2");
+    assertThat(cmdResult.getFooter()).isEqualTo("Tails");
 
-    assertThat(cmdResult.getContent().has("message")).isTrue();
+    assertThat(cmdResult.getValueFromContent("message")).isNotEmpty();
 
     assertThat(cmdResult.getStatus()).isEqualTo(Result.Status.ERROR);
   }
 
   @Test
-  public void tabularResultDataStructure() throws Exception {
+  public void tabularResultDataStructure() {
     TabularResultData result = ResultBuilder.createTabularResultData();
     result.accumulate("column1", "value11");
     result.accumulate("column1", "value12");
     result.accumulate("column2", "value21");
     result.accumulate("column2", "value22");
 
-    result.setFooter("Feet!");
-    result.setHeader("Header");
-    CommandResult cmdResult = (CommandResult) ResultBuilder.buildResult(result);
-
-    assertThat(cmdResult.getGfJsonObject().has("header")).isTrue();
-    assertThat(cmdResult.getGfJsonObject().has("content")).isTrue();
-    assertThat(cmdResult.getGfJsonObject().has("footer")).isTrue();
+    result.setHeader("Heads");
+    result.setFooter("Tails");
+    CommandResult cmdResult = ResultBuilder.buildResult(result);
 
-    assertThat(cmdResult.getContent().has("column1")).isTrue();
-    assertThat(cmdResult.getContent().has("column2")).isTrue();
+    assertThat(cmdResult.getHeader()).isEqualTo("Heads");
+    assertThat(cmdResult.getFooter()).isEqualTo("Tails");
 
-    assertThat(cmdResult.getContent().getJSONArray("column1").toString()).contains("value11");
-    assertThat(cmdResult.getContent().getJSONArray("column1").toString()).contains("value12");
-    assertThat(cmdResult.getContent().getJSONArray("column2").toString()).contains("value21");
-    assertThat(cmdResult.getContent().getJSONArray("column2").toString()).contains("value22");
+    assertThat(cmdResult.getListFromContent("column1")).contains("value11", "value12");
+    assertThat(cmdResult.getListFromContent("column2")).contains("value21", "value22");
   }
 
   @Test
-  public void compositeResultDataStructure() throws Exception {
+  public void compositeResultDataStructure() {
     CompositeResultData result = ResultBuilder.createCompositeResultData();
 
-    result.setFooter("Feet!");
-    result.setHeader("Header");
-
-    assertThat(result.getGfJsonObject().has("header")).isTrue();
-    assertThat(result.getGfJsonObject().has("content")).isTrue();
-    assertThat(result.getGfJsonObject().has("footer")).isTrue();
-
+    result.setHeader("Heads");
+    result.setFooter("Tails");
     // build up an example
     result.addSection().addData("section 0 key", "section 0 value");
     result.addSection().addTable().accumulate("table 1 column", "table 1 value");
 
-    result.addSection();
+    CommandResult cmdResult = ResultBuilder.buildResult(result);
+
+    assertThat(cmdResult.getHeader()).isEqualTo("Heads");
+    assertThat(cmdResult.getFooter()).isEqualTo("Tails");
+
+    assertThat(cmdResult.getMapFromSection("0").get("section 0 key")).isEqualTo("section 0 value");
 
+    Map<String, List<String>> table = cmdResult.getMapFromTableContent("1", "0");
+    assertThat(table.get("table 1 column")).contains("table 1 value");
   }
 
   @Test
-  public void errorCodeCorrectlyUpdated() throws Exception {
+  public void errorCodeCorrectlyUpdated() {
     String json =
         "{\"contentType\":\"table\",\"data\":{\"content\":{\"Member\":[\"server\"],\"Status\":[\"ERROR: Bad.\"]},\"footer\":\"\",\"header\":\"\",\"type-class\":\"org.apache.geode.management.internal.cli.CommandResponse.Data\"},\"debugInfo\":\"\",\"failedToPersist\":false,\"fileToDownload\":null,\"page\":\"1/1\",\"sender\":\"server\",\"status\":-1,\"tokenAccessor\":\"__NULL__\",\"type-class\":\"org.apache.geode.management.internal.cli.CommandResponse\",\"version\":\"1.3.0-SNAPSHOT\",\"whe [...]
 
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ClusterConfigImportDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ClusterConfigImportDUnitTest.java
index 5487e49..7250a2b 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ClusterConfigImportDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ClusterConfigImportDUnitTest.java
@@ -80,7 +80,7 @@ public class ClusterConfigImportDUnitTest extends ClusterConfigTestBase {
         .executeCommand("import cluster-configuration --zip-file-name=" + clusterConfigZipPath);
 
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString()).contains("existing regions: " + regionName);
+    assertThat(result.getContentAsString()).contains("existing regions: " + regionName);
   }
 
   @Test
@@ -92,9 +92,9 @@ public class ClusterConfigImportDUnitTest extends ClusterConfigTestBase {
 
     CommandResult result = gfshConnector
         .executeCommand("import cluster-configuration --zip-file-name=" + clusterConfigZipPath);
-    assertThat(result.getContent().toString())
+    assertThat(result.getContentAsString())
         .contains("Successfully applied the imported cluster configuration on server-1");
-    assertThat(result.getContent().toString())
+    assertThat(result.getContentAsString())
         .contains("Successfully applied the imported cluster configuration on server-2");
     new ClusterConfig(CLUSTER).verify(server1);
     new ClusterConfig(CLUSTER, GROUP2).verify(server2);
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/security/GfshCommandsSecurityTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/security/GfshCommandsSecurityTest.java
index a2980b7..e3d13b1 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/security/GfshCommandsSecurityTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/security/GfshCommandsSecurityTest.java
@@ -137,7 +137,7 @@ public class GfshCommandsSecurityTest {
 
       // for permitted commands, if any error happens, it's not an Unauthorized error
       if (result.getStatus() == Result.Status.ERROR) {
-        assertThat(result.getContent().toString()).doesNotContain("not authorized");
+        assertThat(result.getContentAsString()).doesNotContain("not authorized");
       }
     }
 
@@ -152,7 +152,7 @@ public class GfshCommandsSecurityTest {
       // for some commands there are pre execution checks to check for user input error, will skip
       // those commands
       if (errorCode == ResultBuilder.ERRORCODE_USER_ERROR) {
-        LogService.getLogger().info("Skip user error: " + result.getContent());
+        LogService.getLogger().info("Skip user error: " + result.getContentAsString());
         continue;
       }
 
@@ -178,7 +178,7 @@ public class GfshCommandsSecurityTest {
     CommandResult result =
         gfshConnection.executeCommand("create disk-store --name=disk1 --dir=disk1");
 
-    assertThat(result.getContent().toString()).contains("not authorized for CLUSTER:MANAGE:DISK");
+    assertThat(result.getContentAsString()).contains("not authorized for CLUSTER:MANAGE:DISK");
   }
 
   @Test
@@ -195,7 +195,7 @@ public class GfshCommandsSecurityTest {
     CommandResult result =
         gfshConnection.executeCommand("create region --name=region2 --type=PARTITION_PERSISTENT");
 
-    assertThat(result.getContent().toString()).contains("not authorized for CLUSTER:WRITE:DISK");
+    assertThat(result.getContentAsString()).contains("not authorized for CLUSTER:WRITE:DISK");
   }
 
   @Test
@@ -204,7 +204,7 @@ public class GfshCommandsSecurityTest {
     CommandResult result =
         gfshConnection.executeCommand("create region --name=region2 --type=PARTITION_PERSISTENT");
 
-    assertThat(result.getContent().toString()).contains("not authorized for DATA:MANAGE");
+    assertThat(result.getContentAsString()).contains("not authorized for DATA:MANAGE");
   }
 
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/security/MultiGfshDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/security/MultiGfshDUnitTest.java
index abf80cd..e50b981 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/security/MultiGfshDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/security/MultiGfshDUnitTest.java
@@ -98,7 +98,7 @@ public class MultiGfshDUnitTest {
         // for some commands there are pre execution checks to check for user input error, will skip
         // those commands
         if (errorCode == ResultBuilder.ERRORCODE_USER_ERROR) {
-          LogService.getLogger().info("Skip user error: " + result.getContent());
+          LogService.getLogger().info("Skip user error: " + result.getContentAsString());
           continue;
         }
 
diff --git a/geode-core/src/test/java/org/apache/geode/test/junit/rules/GfshCommandRule.java b/geode-core/src/test/java/org/apache/geode/test/junit/rules/GfshCommandRule.java
index e8e55a7..3e80333 100644
--- a/geode-core/src/test/java/org/apache/geode/test/junit/rules/GfshCommandRule.java
+++ b/geode-core/src/test/java/org/apache/geode/test/junit/rules/GfshCommandRule.java
@@ -20,10 +20,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.io.File;
 import java.io.IOException;
 import java.io.UncheckedIOException;
+import java.util.List;
 import java.util.function.Supplier;
 
 import org.apache.commons.lang.StringUtils;
-import org.json.JSONArray;
 import org.junit.rules.TemporaryFolder;
 import org.junit.runner.Description;
 
@@ -227,16 +227,15 @@ public class GfshCommandRule extends DescribedExternalResource {
     } catch (InterruptedException e) {
       throw new RuntimeException(e);
     }
-    if (StringUtils.isBlank(gfsh.outputString) && result != null && result.getContent() != null) {
+    if (StringUtils.isBlank(gfsh.outputString) && result != null
+        && !result.getContentAsString().isEmpty()) {
       if (result.getStatus() == Result.Status.ERROR) {
         gfsh.outputString = result.toString();
       } else {
         // print out the message body as the command result
-        JSONArray messages = ((JSONArray) result.getContent().get("message"));
-        if (messages != null) {
-          for (int i = 0; i < messages.length(); i++) {
-            gfsh.outputString += messages.getString(i) + "\n";
-          }
+        List<String> messages = result.getListFromContent("message");
+        for (String line : messages) {
+          gfsh.outputString += line + "\n";
         }
       }
     }

-- 
To stop receiving notification emails like this one, please contact
jensdeppe@apache.org.