code: @SuppressWarnings({ "rawtypes", "unchecked" })
    static NamedList<Object> decode(NamedList<Object> nl) {
      for (int i = 0; i < nl.size(); i++) {
        String key = nl.getName(i);
        Object o = nl.getVal(i);
        if (key.matches("^_encoded_.*$")) {
          if (o instanceof String) {
            Object decodedObject = decode((String) nl.getVal(i));
            String decodedKey = key.replaceFirst("^_encoded_", "");
            if (decodedKey.equals("")) {
              decodedKey = "_" + decodedObject.getClass().getSimpleName() + "_";
            }
            nl.setName(i, decodedKey);
            nl.setVal(i, decodedObject);
          } else if (o instanceof NamedList) {
            NamedList nl2 = (NamedList) o;
            for (int j = 0; j < nl2.size(); j++) {
              if (nl2.getVal(j) instanceof String) {
                nl2.setVal(j, decode((String) nl2.getVal(j)));
              }
            }
          } else {
            // System.out.println("unknown type " +
            // o.getClass().getCanonicalName());
          }
        } else {
          if (o instanceof NamedList) {
            nl.setVal(i, decode((NamedList<Object>) o));
          } else if (o instanceof ArrayList) {
            nl.setVal(i, decode((ArrayList<Object>) o));
          }
        }
      }
      return nl;
    }
docs: Decode.
  
  @param nl the nl
  @return the named list