[
https://issues.apache.org/jira/browse/GROOVY-11314?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17818119#comment-17818119
]
Paul King edited comment on GROOVY-11314 at 2/17/24 11:58 AM:
--------------------------------------------------------------
Currently JsonOutput supports only the following:
{code:groovy}
assert toJson(json1.tap{ name = unescaped(name)}) == '{"name":Jerry}'
assert toJson(json2.tap{ name = unescaped(name)}) == '{"name":Järry}'
assert toJson(json1.tap{ name = unescaped('"' + name + '"')}) ==
'{"name":"Jerry"}'
assert toJson(json2.tap{ name = unescaped('"' + name + '"')}) ==
'{"name":"Järry"}'
{code}
Which I agree would be a little painful to have to do for something brought in
by JsonSlurper.
The defaults are set for historical reasons. We didn't want to break existing
scripts, so we set the default behavior to be what the initial implementation
supported.
If you look at JsonOutput, you'll see all the methods (and fields) are static.
While you could instantiate it, it isn't designed with that in mind. If you
were going to instantiate an instance, and provide a JsonGenerator, why not
just use the JsonGenerator? It would be less code? JsonOutput exists for use
cases where you don't want to bother with creating a generator.
was (Author: paulk):
Currently JsonOutput supports only the following:
{code:groovy}
assert toJson(json1.tap{ name = unescaped(name)}) == '{"name":Jerry}'
assert toJson(json2.tap{ name = unescaped(name)}) == '{"name":Järry}'
assert toJson(json1.tap{ name = unescaped('"' + name + '"')}) ==
'{"name":"Jerry"}'
assert toJson(json2.tap{ name = unescaped('"' + name + '"')}) ==
'{"name":"Järry"}'
{code}
Which I agree would be a little painful to have to do for something brought in
by JsonSlurper.
The defaults are set for historical reasons. We didn't want to break existing
scripts, so we set the default behavior to be what the initial implementation
supported.
> JsonOutput Pretty Print always escapes characters
> -------------------------------------------------
>
> Key: GROOVY-11314
> URL: https://issues.apache.org/jira/browse/GROOVY-11314
> Project: Groovy
> Issue Type: Wish
> Components: JSON
> Affects Versions: 2.5.23, 3.0.20, 4.0.18
> Reporter: Denis Jakupovic
> Priority: Major
>
> Hi,
> the groovy.json package is widely used.
> [https://github.com/apache/groovy/blob/master/subprojects/groovy-json/src/main/java/groovy/json/JsonOutput.java]
>
> If we use the toPrettyString function the json is being escaped.
> {code:java}
> JsonBuilder Class:
> public String toPrettyString() {
> return JsonOutput.prettyPrint(toString());
> } {code}
> However, we can construct a JsonBuilder with JsonGenerator and
> disableUnicodeEscaping and use new JsonBuilder(content, generator).toString()
> to create a proper json string representation. This is not possible with
> JsonOutput though because there is a final constructor and uses a default
> generator. However disableUnicodeEscaping is true by default but it is not
> handled properly by the JsonOutput class. It would be great if the JsonOutput
> had the same feature to construct JsonOutput with a custom JsonGenerator. The
> JsonOutput object uses the DefaultJsonGenerator with enabled unicode escaping
> through Options but the toJson() and prettyPrint methods do not handle the
> escaping properly.
> [https://github.com/apache/groovy/blob/GROOVY_3_0_X/subprojects/groovy-json/src/main/java/groovy/json/JsonOutput.java#L209|https://github.com/apache/groovy/blob/GROOVY_3_0_X/subprojects/groovy-json/src/main/java/groovy/json/JsonOutput.java#L162]
> {code:java}
> case STRING:
> String textStr = token.getText();
> String textWithoutQuotes = textStr.substring(1, textStr.length() - 1);
> if (textWithoutQuotes.length() > 0) {
> output.addJsonEscapedString(textWithoutQuotes);
> } else {
> output.addQuoted(Chr.array());
> }
> break; {code}
> And here:
> [https://github.com/apache/groovy/blob/master/subprojects/groovy-json/src/main/java/org/apache/groovy/json/internal/CharBuf.java#L379]
> {code:java}
> public final CharBuf addJsonEscapedString(final char[] charArray, boolean
> disableUnicodeEscaping) {
> if (charArray.length == 0) return this;
> if (hasAnyJSONControlChars(charArray, disableUnicodeEscaping)) {
> return doAddJsonEscapedString(charArray, disableUnicodeEscaping);
> } else {
> return this.addQuoted(charArray);
> }
> } {code}
> *If the JsonBuilder is constructed with a JsonGenerator it should be
> constructed with JsonOuput as well and the prettyPrint and toJson function
> shall not add escaped strings.* *The Bug is in JsonOutput in the CharBuf
> call.*
> This has to be fixed for toPretty method:
> {code:java}
> case STRING:
> String textStr = token.getText();
> String textWithoutQuotes = textStr.substring(1, textStr.length() - 1);
> if (textWithoutQuotes.length() > 0) {
> output.addJsonEscapedString(textWithoutQuotes, disableUnicodeEscaping);
> } else {
> output.addQuoted(Chr.array());
> }
> break; {code}
> output.addJsonEscapedString(textWithoutQuotes, disableUnicodeEscaping) should
> be called with disableUnicodeEscaping.
> Currently there is no way to prettyPrint a json with the groovy.json classes
> without having escaped characters in the generated json.
> Best
> Denis
--
This message was sent by Atlassian Jira
(v8.20.10#820010)