Typed root encode without *type; JSON member names are written as bin tags for Vala/GObject lookup (HTTP Hub): leading _ maps to underscore_, then _ to -; GObject-reserved wire names (e.g. type) map to reserved_property_NAME properties on decode and reserved_property_NAME encodes as wire NAME.