groovy-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Paul King (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (GROOVY-8916) JsonOutput unable to serialize Locale object
Date Wed, 12 Dec 2018 06:22:00 GMT

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

Mime
View raw message