It's possible but a little involved since it has to traverse through the whole structure, build up a tree of all the attribute names it finds, then apply various geometries to known table structures. Step one would be to organize a structure like this:
container:root
name:id; type:int
name:name; type: string; length:5 (based on the longest length you see in the data)
name events; type:collection of event_obj
container:event_obj
name:ts; type:int;
name:what; type:string
then you go through that and generate two tables. the tables would probably get surrogate primary keys added in, and you can also make a rule "if the container already has an integer name 'id', that's the pk".
the structure is essentially a tree (every node has one parent) so I don't think you'd see any many-to-many relationships falling out of it.