docs: private boolean parseJsonParams(Object[] params) throws Exception
      {
          boolean checkValidity = true;
          if (params[0] == null) {
              throw new Exception("@SnapshotSave JSON blob is null");
          }
          if (!(params[0] instanceof String)) {
              throw new Exception("@SnapshotSave JSON blob is a " +
                      params[0].getClass().getSimpleName() +
                      " and should be a java.lang.String");
          }
          final JSONObject jsObj = new JSONObject((String)params[0]);
  
          // IZZY - Make service an enum and store it in the object if
          // we every introduce another one
          if (jsObj.has(SnapshotUtil.JSON_SERVICE)) {
              String service = jsObj.getString(SnapshotUtil.JSON_SERVICE);
              if (service.equalsIgnoreCase("log_truncation")) {
                  m_truncationRequest = true;
                  if (!VoltDB.instance().getCommandLog().isEnabled()) {
                      throw new Exception("Cannot ask for a command log truncation snapshot when " +
                              "command logging is not present or enabled.");
                  }
                  // for CL truncation, don't care about any of the rest of the blob.
                  return checkValidity;
              }
              else {
                  throw new Exception("Unknown snapshot save service type: " + service);
              }
          }
  
          m_stype = SnapshotPathType.valueOf(jsObj.optString(SnapshotUtil.JSON_PATH_TYPE, SnapshotPathType.SNAP_PATH.toString()));
          if (jsObj.has(SnapshotUtil.JSON_URIPATH)) {
              m_path = jsObj.getString(SnapshotUtil.JSON_URIPATH);
              if (m_path.isEmpty()) {
                  throw new Exception("uripath cannot be empty");
              }
          } else {
              m_stype = SnapshotPathType.SNAP_AUTO;
              m_path = "file:///" + VoltDB.instance().getCommandLogSnapshotPath();
          }
          URI pathURI = new URI(m_path);
          String pathURIScheme = pathURI.getScheme();
          if (pathURIScheme == null) {
              throw new Exception("URI scheme cannot be null");
          }
          if (!pathURIScheme.equals("file")) {
              throw new Exception("Unsupported URI scheme " + pathURIScheme +
                      " if this is a file path then you must prepend file://");
          }
          m_path = pathURI.getPath();
          if (jsObj.has(SnapshotUtil.JSON_NONCE)) {
              m_nonce = jsObj.getString(SnapshotUtil.JSON_NONCE);
              if (m_nonce.isEmpty()) {
                  throw new Exception("nonce cannot be empty");
              }
          } else {
              m_nonce = MAGIC_NONCE_PREFIX + System.currentTimeMillis();
              //This is a valid JSON
              checkValidity = false;
          }
  
          Object blockingObj = false;
          if (jsObj.has(SnapshotUtil.JSON_BLOCK)) {
              blockingObj = jsObj.get(SnapshotUtil.JSON_BLOCK);
          }
          if (blockingObj instanceof Number) {
              m_blocking = ((Number)blockingObj).byteValue() == 0 ? false : true;
          } else if (blockingObj instanceof Boolean) {
              m_blocking = (Boolean)blockingObj;
          } else if (blockingObj instanceof String) {
              m_blocking = Boolean.valueOf((String)blockingObj);
          } else {
              throw new Exception(blockingObj.getClass().getName() + " is not supported as " +
                      " type for the block parameter");
          }
  
          m_format = SnapshotFormat.NATIVE;
          String formatString = jsObj.optString(SnapshotUtil.JSON_FORMAT,SnapshotFormat.NATIVE.toString());
  
          m_terminus = jsObj.has(SnapshotUtil.JSON_TERMINUS) ? jsObj.getLong(SnapshotUtil.JSON_TERMINUS) : null;
          /*
           * Try and be very flexible about what we will accept
           * as the type of the block parameter.
           */
          try {
              m_format = SnapshotFormat.getEnumIgnoreCase(formatString);
          } catch (IllegalArgumentException argException) {
              throw new Exception("@SnapshotSave format param is a " + m_format +
                      " and should be one of [\"native\" | \"csv\"]");
          }
          m_data = (String)params[0];
          return checkValidity;
      }