[
https://issues.apache.org/jira/browse/GROOVY-7946?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15521368#comment-15521368
]
ASF GitHub Bot commented on GROOVY-7946:
----------------------------------------
Github user jwagenleitner commented on a diff in the pull request:
https://github.com/apache/groovy/pull/429#discussion_r80391169
--- Diff:
subprojects/groovy-json/src/main/java/groovy/json/StreamingJsonBuilder.java ---
@@ -651,6 +655,18 @@ public void call(String name, JsonOutput.JsonUnescaped
json) throws IOException
writer.write(json.toString());
}
+ /**
+ * Writes the given Writable as the value of the given attribute
name
+ *
+ * @param name The attribute name The attribute name
+ * @param json The value The writable
--- End diff --
descriptions for the params seems to be repeated twice.
> 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)