Graeme Rocher created GROOVY-7946:
-------------------------------------

             Summary: StreamingJsonBuilder should support writable values
                 Key: GROOVY-7946
                 URL: https://issues.apache.org/jira/browse/GROOVY-7946
             Project: Groovy
          Issue Type: Improvement
    Affects Versions: 2.4.7
            Reporter: Graeme Rocher


In order to compose logic with StreamingJsonBuilder it is often desirable to 
split up the code into parts to make it more maintainable. For example with 
Grails' JSON views you may have several different templates that make up the 
entire JSON response.

In order to support this we had to fork StreamingJsonBuilder and add the 
capability to pass a Writable as a value. The reason is, otherwise you have to 
buffer in memory an entire string for child template. For example now you would 
have to do something like this:

{code}
        new StringWriter().with { w ->
            def builder = new StreamingJsonBuilder(w)
            def sw = new StringWriter() 
           new StreamingJsonBuilder(sw).call {
                        sectionId "world"
            }
            builder.response {
                status "ok"
                results sw.toString()
            }
      }
{code}

Which is inefficient and eliminates the memory benefits of streaming. Ideally 
you want to do this:

{code}
        new StringWriter().with { w ->
            def builder = new StreamingJsonBuilder(w)
            def writable = new Writable() {
                @Override
                Writer writeTo(Writer writer) throws IOException {
                    new StreamingJsonBuilder(writer).call {
                        sectionId "world"
                    }
                    return writer
                }
            }
            builder.response {
                status "ok"
                results writable
            }
        }
{code}

Which allows you to continue streaming for child attributes of a JSON document. 

I have a pull request incoming for this improvement



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to