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

Denis Jakupovic updated GROOVY-11314:
-------------------------------------
    Description: 
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. 
{code:java}
JsonOutput Class:
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

  was:
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. The JsonOutput object uses the 
DefaultJsonGenerator with enabled unicode escaping. We need an option here and 
another logic in the prettyPrint function see here:
{code:java}
JsonOutput Class:
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


> 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: 3.0.19
>            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. 
> {code:java}
> JsonOutput Class:
> 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