code: public void call(String name, Map map, @DelegatesTo(StreamingJsonDelegate.class) Closure callable) throws IOException {
          writer.write(JsonOutput.OPEN_BRACE);
          writer.write(generator.toJson(name));
          writer.write(COLON_WITH_OPEN_BRACE);
          boolean first = true;
          for (Object it : map.entrySet()) {
              if (!first) {
                  writer.write(JsonOutput.COMMA);
              } else {
                  first = false;
              }
  
              Map.Entry entry = (Map.Entry) it;
              String key = entry.getKey().toString();
              if (generator.isExcludingFieldsNamed(key)) {
                  continue;
              }
              Object value = entry.getValue();
              if (generator.isExcludingValues(value)) {
                  return;
              }
              writer.write(generator.toJson(key));
              writer.write(JsonOutput.COLON);
              writer.write(generator.toJson(value));
          }
          StreamingJsonDelegate.cloneDelegateAndGetContent(writer, callable, map.size() == 0, generator);
          writer.write(DOUBLE_CLOSE_BRACKET);
      }
docs: If you use named arguments and a closure as last argument,
  the key/value pairs of the map (as named arguments)
  and the key/value pairs represented in the closure
  will be merged together &mdash;
  the closure properties overriding the map key/values
  in case the same key is used.
  
  <pre class="groovyTestCase">
  new StringWriter().with { w {@code ->}
  def json = new groovy.json.StreamingJsonBuilder(w)
  json.person(name: "Tim", age: 35) { town "Manchester" }
  
  assert w.toString() == '{"person":{"name":"Tim","age":35,"town":"Manchester"}}'
  }
  </pre>
  
  @param name The name of the JSON object
  @param map The attributes of the JSON object
  @param callable Additional attributes of the JSON object represented by the closure
  @throws IOException