code: public final AutoBuffer writeJSON_impl(AutoBuffer ab) {
      ab.putJSONStr("name", name);                                    ab.put1(',');
      ab.putJSONStr("label", name);                                   ab.put1(',');
      ab.putJSONStr("help", help);                                    ab.put1(',');
      ab.putJSONStrUnquoted("required", required ? "true" : "false"); ab.put1(',');
      ab.putJSONStr("type", type);                                    ab.put1(',');
  
      if (default_value instanceof IcedWrapper) {
        ab.putJSONStr("default_value").put1(':');
        ((IcedWrapper) default_value).writeUnwrappedJSON(ab);            ab.put1(',');
      } else {
        ab.putJSONStr("default_value").put1(':').putJSON(default_value); ab.put1(',');
      }
  
      if (actual_value instanceof IcedWrapper) {
        ab.putJSONStr("actual_value").put1(':');
        ((IcedWrapper) actual_value).writeUnwrappedJSON(ab);             ab.put1(',');
      } else {
        ab.putJSONStr("actual_value").put1(':').putJSON(actual_value);   ab.put1(',');
      }
  
      ab.putJSONStr("level", level);                                            ab.put1(',');
      ab.putJSONAStr("values", values);                                         ab.put1(',');
      ab.putJSONAStr("is_member_of_frames", is_member_of_frames);               ab.put1(',');
      ab.putJSONAStr("is_mutually_exclusive_with", is_mutually_exclusive_with); ab.put1(',');
      ab.putJSONStrUnquoted("gridable", gridable ? "true" : "false");
      return ab;
    }
docs: ModelParameterSchema has its own serializer so that default_value and actual_value
  get serialized as their native types.  Autobuffer assumes all classes that have their
  own serializers should be serialized as JSON objects, and wraps them in {}, so this
  can't just be handled by a customer serializer in IcedWrapper.
  
  @param ab
  @return