[ 
https://issues.apache.org/jira/browse/GROOVY-11314?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Denis Jakupovic updated GROOVY-11314:
-------------------------------------
    Affects Version/s: 4.0.18
                       3.0.20
                       2.5.23
                           (was: 3.0.19)

> JsonOutput Pretty Print always escapes characters
> -------------------------------------------------
>
>                 Key: GROOVY-11314
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11314
>             Project: Groovy
>          Issue Type: Bug
>          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, this is not possible with JsonOutput though because 
> there is a final constructor. However it is true in default. 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. 
> [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 function shall not add 
> escaped strings.* *The Bug is in JsonOutput.*
> This has to be fixed: 
> {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)

Reply via email to