Okay, here is version 0.1 - the most basic useful functionality to aid in
writing mappings.

"Assuming Neo-JSON-Core is loaded"
Gofer it
        smalltalkhubUser: 'SeanDeNigris' project: 'SeansPlayground';
        package: 'Neo-JSON-Utilities';
        load.

Now if you:
        reader := NeoJSONReader on: entity contents readStream.
        reader nextAs: MyClass "(that does not implement MyClass
class>>#neoJsonMapping:)".

You will get a debugger (which you probably want to close because the new
mappings we create will not be activated as the helper hook is cached in the
mappings) and a tree inspector on a NeoJSON model that you can customize,
where:
- a NeoJSONObject represents each JSON dictionary; for the enclosing object,
the schema is already set to MyClass (i.e. the argument to #nextAs:)
- a NeoJSONList represents each JSON list
- a NeoJSONValue represents all other values e.g. bools, nil, strings,
numbers

Some useful things to do:
- For each NeoJSONObject that you want to map to a class, select it in the
explorer and:
  self schema: MyOtherClass.
  self generateInstVars. "self explanatory?"
  self mappingSourceCode inspect. "see the neoJsonMapping: source that would
be generated"
  self generateMapping. "compile class-side neoJsonMapping:"
- Select any field inside a NeoJSONObject that you want to map to an inst
var with a different name and:
  self instVarName: #isSaved "(e.g. to map JSON fields_with_underscores to
camelCase var names)"
- Specify the element type of a list by selecting it and:
  self elementSchema: MyListReturnType. "This will automatically set the
schema to #ArrayOfMyListReturnType, but you can change that manually if you
want by sending #schema:)

After customizing, sending #generateMapping to a NeoJSONObject should
generate something like:
    neoJsonMapping: mapper
        mapper for: self do: [ :mapping |
                mapping mapInstVars: #(notes id).
                (mapping mapInstVar: #day) valueSchema: Date.
                (mapping mapInstVar: #events) valueSchema: #ArrayOfMyEvent.
                mapping mapInstVar: #isSaved to: #is_saved.
                (mapping mapInstVar: #timeSaved) valueSchema: DateAndTime ].

        mapper for: Date customDo: [ :mapping | ]. "now you specify how to 
convert
the string to a Date"
        mapper for: #ArrayOfMyEvent customDo: [ :mapping |
                mapping listOfElementSchema: MyEvent ].
        mapper for: DateAndTime customDo: [ :mapping | ]. "same as Date above"

This started as a tiny little personal experiment that got away from me, ha
ha, so there is no UI, tests, or doc (except for this post). MIT of course.
Enjoy!



-----
Cheers,
Sean
--
View this message in context: 
http://forum.world.st/ANN-Little-NeoJSON-Helper-tp4756763p4757243.html
Sent from the Pharo Smalltalk Developers mailing list archive at Nabble.com.

Reply via email to