When you set Content-Type to json, you need to stringify the input.
var xhr = Ti.Network.createHTTPClient();
xhr.open('POST', url);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader('charset','utf-8');
xhr.send(JSON.stringify({
prop: 'string',
data: {
embeddedProp: 1234
}
}));
Tried this out and it worked, wasn't able to find it in the documentation.