[ 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)