top level is always a map