[ https://issues.apache.org/jira/browse/GROOVY-11314?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Paul King closed GROOVY-11314. ------------------------------ > 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 > Assignee: Paul King > Priority: Major > Fix For: 4.0.19, 5.0.0-alpha-6 > > > 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)