[ 
https://issues.apache.org/jira/browse/GROOVY-8916?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16718505#comment-16718505
 ] 

Paul King commented on GROOVY-8916:
-----------------------------------

One of the properties of the Locale class is the "default" Locale. Hence, that 
object serializes into:
{code}
{"loc":{"script":"","ISO3Country":"FRA","localeExtensions":null,"ISO3Language":"fra","displayCountry":"France",
   
"default":{"script":"","ISO3Country":"AUS","localeExtensions":null,"ISO3Language":"eng","displayCountry":"Australia",
     
"default":{"script":"","ISO3Country":"AUS","localeExtensions":null,"ISO3Language":
 ...
{code}

Rather than trying to handle cases like this, in Groovy 2.5 we added the 
ability to customize JSON generation. You can look at the 2.5 release notes or 
view this blog here:

http://mrhaki.blogspot.com/2018/06/groovy-goodness-customizing-json-output.html

In your case you can do:

{code}
import groovy.json.*

def generator = new JsonGenerator.Options()
        .addConverter(Locale) { Locale loc -> loc.toString() }
        .build()

println generator.toJson([loc: Locale.FRANCE])
// => {"loc":"fr_FR"}
{code}

> JsonOutput unable to serialize Locale object
> --------------------------------------------
>
>                 Key: GROOVY-8916
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8916
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>    Affects Versions: 2.4.15
>            Reporter: Sébastien Gadot
>            Priority: Minor
>
> Trying to serialize an object containing a Locale throws 
> StackOverflowException
> example :
>  
>  
> {code:java}
> JsonOutput.toJson([loc: Locale.FRANCE])
> // expected {"loc": "fr_FR"}
> // got StackOverflowException
> {code}
> {code:java}
> java.lang.StackOverflowError
> at 
> java.lang.reflect.InvocationTargetException.<init>(InvocationTargetException.java:72)
> at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
> at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:498)
> at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
> at groovy.lang.MetaBeanProperty.getProperty(MetaBeanProperty.java:59)
> at groovy.lang.PropertyValue.getValue(PropertyValue.java:42)
> at 
> org.codehaus.groovy.runtime.DefaultGroovyMethods.getProperties(DefaultGroovyMethods.java:474)
> at groovy.json.JsonOutput.getObjectProperties(JsonOutput.java:338)
> at groovy.json.JsonOutput.writeObject(JsonOutput.java:331)
> at groovy.json.JsonOutput.writeMap(JsonOutput.java:469)
> at groovy.json.JsonOutput.writeObject(JsonOutput.java:332)
> at groovy.json.JsonOutput.writeMap(JsonOutput.java:469)
> {code}
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to