You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (JIRA)" <ji...@apache.org> on 2018/12/12 06:23:00 UTC

[jira] [Comment Edited] (GROOVY-8916) JsonOutput unable to serialize Locale object

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

Paul King edited comment on GROOVY-8916 at 12/12/18 6:22 AM:
-------------------------------------------------------------

One of the properties of the Locale class is the "default" Locale. Hence, that object serializes into (your details may vary slightly):
{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}


was (Author: paulk):
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)