Can you show us the exact string which is getting sent? My guess is that you are embedding JSON structures inside the message when really you should be just using strings.
For example, I get you are sending something like this:
{
"default": "foo",
"http": {"anotherThing":1},
}
When in reality what you need to send is:
{
"default": "foo",
"http": "{\"anotherThing\":1}",
}
I would try changing the code to:
JSONObject jsonMessage = new JSONObject();
jsonMessage.put(DEFAULT, "foo");
jsonMessage.put(HTTPS, someOtherJsonObject.toString());
jsonMessage.put(HTTP, someOtherJsonObject.toString());
PublishRequest publishRequest = new PublishRequest(topicArn, jsonMessage.toString());
publishRequest.setMessageStructure(MESSAGE_TYPE_JSON);
amazonSNSClient.publish(publishRequest);