I have a prototype fix. It alters RecordTypeASTTransformation to emit a BeanInfo class in the emulate case and MetaClassImpl to handle properties within native records. The following script then works:
============ @RecordOptions(mode=EMULATE) record PersonA(String name) {} @RecordOptions(mode=NATIVE) record PersonB(String name) {} class PersonC { String name } def a = new PersonA('Guillaume') println a.metaClass.properties*.name println a.metaClass.properties*.class.simpleName def b = new PersonB('Jochen') println b.metaClass.properties*.name println b.metaClass.properties*.class.simpleName def c = new PersonC(name: 'Eric') println c.metaClass.properties*.name println c.metaClass.properties*.class.simpleName import groovy.json.JsonOutput println JsonOutput.toJson([a,b,c]) ============= With output: [name, serialVersionUID, class] [MetaBeanProperty, CachedField, MetaBeanProperty] [name, serialVersionUID, class] [MetaBeanProperty, CachedField, MetaBeanProperty] [name, class] [MetaBeanProperty, MetaBeanProperty] [{"name":"Guillaume"},{"name":"Jochen"},{"name":"Eric"}] I'll add some more tests and create a PR tomorrow. Paul. <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> Virus-free.www.avast.com <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> On Tue, Sep 5, 2023 at 6:48 PM Guillaume Laforge <glafo...@gmail.com> wrote: > > I also forget the fact that Groovy records are not always Java records when > running on older JDKs... > So it needs to make the difference with real and groovy-specific fallthrough > records. > > On Tue, Sep 5, 2023 at 10:46 AM Guillaume Laforge <glafo...@gmail.com> wrote: >> >> Sure, I just created: >> https://issues.apache.org/jira/browse/GROOVY-11167 >> >> Also, thanks for the workaround. >> I ended up just using a POGO instead, but I hadn't thought of implementing a >> Map. >> >> I guess JsonOutput needs to be updated here. >> I suppose we would add a new if case that check if the class of the object >> is a record, and the retrieve the components with >> clazz.getRecordComponents()? >> >> Guillaume >> >> On Tue, Sep 5, 2023 at 7:44 AM Paul King <pa...@asert.com.au> wrote: >>> >>> We aren't picking up the metabean properties for the record correctly. >>> Would you like to file a bug report? >>> >>> Workarounds are to call "toMap()" (or *.toMap() on the list), or do >>> something like: >>> ``` >>> @AutoImplement >>> record Person(String name) implements Map { >>> Set entrySet() { toMap().entrySet() } >>> } >>> ``` >>> >>> >>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> >>> Virus-free.www.avast.com >>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> >>> <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> >>> >>> On Tue, Sep 5, 2023 at 2:13 AM Guillaume Laforge <glafo...@gmail.com> wrote: >>> > >>> > Hi, >>> > >>> > I was a bit surprised by this behavior with serializing records in JSON. >>> > >>> > I was expecting this assertion to pass: >>> > >>> > import groovy.json.JsonOutput >>> > record Person(String name) {} >>> > assert JsonOutput.toJson([new Person('Guillaume')]) == >>> > '[{"name":"Guillaume"}]' >>> > >>> > Instead, I got [{}] >>> > >>> > Shouldn't records be treated like POGOs and thus serialize the same way >>> > like in my example above? Or is there a good reason why this is not the >>> > case? >>> > >>> > Guillaume >>> > >>> > -- >>> > Guillaume Laforge >>> > Apache Groovy committer >>> > Developer Advocate @ Google Cloud >>> > >>> > Blog: glaforge.dev >>> > Twitter: @glaforge >>> > Mastodon: @glafo...@uwyn.net >> >> >> >> -- >> Guillaume Laforge >> Apache Groovy committer >> Developer Advocate @ Google Cloud >> >> Blog: glaforge.dev >> Twitter: @glaforge >> Mastodon: @glafo...@uwyn.net > > > > -- > Guillaume Laforge > Apache Groovy committer > Developer Advocate @ Google Cloud > > Blog: glaforge.dev > Twitter: @glaforge > Mastodon: @glafo...@uwyn.net