You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Jochen Theodorou (JIRA)" <ji...@apache.org> on 2015/05/07 01:46:01 UTC
[jira] [Resolved] (GROOVY-6416) JsonBuilder returns blank {} format
inside a mixin when using 'this' to pass to JsonBuilder
[ https://issues.apache.org/jira/browse/GROOVY-6416?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jochen Theodorou resolved GROOVY-6416.
--------------------------------------
Resolution: Cannot Reproduce
Assignee: Jochen Theodorou
closing because not enough information was given to reproduce the problem
> JsonBuilder returns blank {} format inside a mixin when using 'this' to pass to JsonBuilder
> -------------------------------------------------------------------------------------------
>
> Key: GROOVY-6416
> URL: https://issues.apache.org/jira/browse/GROOVY-6416
> Project: Groovy
> Issue Type: Bug
> Components: JSON
> Affects Versions: 2.1.6, 2.1.8
> Environment: GGTS grails IDE using groovy 2.1.6
> Reporter: William Woodman
> Assignee: Jochen Theodorou
> Priority: Minor
> Labels: jsonBuilder, mixin
>
> bit weird this.
> i was trying to do a simple persistence excercise using GMongo and what i did was try a simple mixin - to take the Json output of a class i add the mixin to and post into mongoDB. However i hit a snag and i suspect its a bug but not sure and have not received a post back from any of the fora - so here goes
>
> i define a simple test class like this (its in a script file)
> {code}
> class MyClass {
> String name
> int size
> }
> //set the mixin
> MyClass.mixin Persistence
> def myClass = new MyClass(name:"william", size:10)
> JsonBuilder bldr = new JsonBuilder(myClass)
> println "myClass json : " + bldr.toString()
> {code}
> this all works as expected and the bldr generates the right string when i pass the instance of my class to the JsonBuilder - outside the mixin.
> my persistence mixin looks like this at the moment
> {code}
> //this is a mixin class - and trace debug stuff
> class Persistence {
> def save () {
> println "this: "+ this.class + " with name: $name and size " + this.size + " dump: " + this.dump()
> def will = new Person (first:"will", last:'woodman', langs: ['script': 'groovy', 'static': 'java'])
> JsonBuilder bldr = new JsonBuilder(this)
> println "content : " + bldr.content + " pretty str :" + bldr.toPrettyString()
> JsonBuilder bldr2 = new JsonBuilder()
> JsonBuilder bldr3 = new JsonBuilder()
> JsonBuilder bldr4 = new JsonBuilder(will)
> /*def root = bldr2.export {
> thingy {
> firstName: "william"
> psize: 10
> address (town: 'ipswich', postcode: 'IP4 2TH')
> }
> }*/
> //map form
> bldr2 name : this.name, size : this.size
> //closure form
> bldr3 {
> name this.name
> size this.size
> }
> println "bldr: " + bldr.toString()
> println "bldr2: " + bldr2.toString()
> println "bldr3: " + bldr3.toString()
> println "bldr4: " + bldr4.toString()
> {code}
> when i run the code and use the first iplementation and pass 'this' which is an instance of MyClass as this is a mixin - then i get am empty Json string - not the right answer
> line 3 in save : JsonBuilder bldr = new JsonBuilder(this) - produces '{}'
> I tried creating a local class just above and pass that to JsonBuilder and it works fine for that instance
>
> then out of perversity - if i change the original class definition to add Cloneable like this
>
> {code}
> class MyClass implements Cloneable{
> String name
> int size
> }
> {code}
> and change the Mixin to pass a clone of 'this' and pass the clone to the bldr it all works correctly
>
> {code}
> //this is a mixin class
> class Persistence {
> def save () {
> println "this: "+ this.class + " with name: $name and size " + this.size + " dump: " + this.dump()
> def will = new Person (first:"will", last:'woodman', langs: ['script': 'groovy', 'static': 'java'])
> JsonBuilder bldr = new JsonBuilder(this.clone())
> println "content : " + bldr.content + " pretty str :" + bldr.toPrettyString()
> {code}
>
> line 3 in save now reads : JsonBuilder bldr = new JsonBuilder(this.clone()) and this works correctly with a fully formatted json string
> - i dont really want to have to have the object to persist to have to to implement Cloneable. so why does the first form - new JsonBuilder (this) return me an {} json string - but the second form - new JsonBuilder(this.clone()) works just fine - very weird - has any one got any ideas as to why its doing this
>
> within the mixin - this is an instance of MyClass as expected - here is the trace of the working cloneable version - and as you can see the last line bldr: is the correct form
>
> {code}
> myClass json : {"size":10,"name":"william"}
> this: class com.softwood.MyClass with name: william and size 10 dump: <com.softwood.MyClass@1c0bddc name=william size=10>
> content : com.softwood.MyClass@643473 pretty str :{
> "size": 10,
> "name": "william"
> }
> bldr: {"size":10,"name":"william"}
> {code}
> here is the same trace using removing the Cloneable and just passing this to the builder in the mixin
>
> {code}
> myClass json : {"size":10,"name":"william"}
> this: class com.softwood.MyClass with name: william and size 10 dump: <com.softwood.MyClass@f0cae7 name=william size=10>
> content : com.softwood.Persistence@af778e pretty str :{
>
> }
> bldr: {}
> {code}
> I cant for the life of me figure out why this is so - and have elected to try and contruct a map from the properties variable instead and persist the class via this route - so i sort of have another angle of attack -
> If this is not a bug but a feature - perhaps someone could explain why it works this way as it doesnt make sense to me
>
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)