i am using FCM
for push messages and handling all incoming push notification in onMessageReceived. Now the issue is with parsing nested json that comes inside this function remoteMessage.getData()
I have following block coming as a push notification in device. content of data payload could be varied here it is dealer later on it can be productInfo
{
"to": "/topics/DATA",
"priority": "high",
"data": {
"type": 6,
"dealerInfo": {
"dealerId": "358",
"operationCode": 2
}
}
}
this how i am parsing it
if(remoteMessage.getData()!=null){
JSONObject object = null;
try {
object = new JSONObject(remoteMessage.getData());
} catch (JSONException e) {
e.printStackTrace();
}
}
now i am getting data with blackslashes as remoteMessage.getData()
returns Map<String,String>
so probably my nested block is being converted in string not sure though.
{
"wasTapped": false,
"dealerInfo": "{\"dealerId\":\"358\",\"operationCode\":2}",
"type": "6"
}
and if i write object = new JSONObject(remoteMessage.getData().toString());
then it got failed with following notification
{
"to": "regid",
"priority": "high",
"notification" : {
"body": "Message Body",
"title" : "Call Status",
"click_action":"FCM_PLUGIN_ACTIVITY"
},
"data": {
"type": 1,
"callNumber":"ICI17012702",
"callTempId":"0",
"body": "Message Body",
"title" : "Call Status"
}
}
error i get is
> org.json.JSONException: Unterminated object at character 15 of
> {body=Message Body, type=1, title=Call Status, callNumber=ICI17012702,
> callTempId=0}
Since
dealerInfo
is parsed as string and not an object, create a new JSONObject with the stringI didn't want to add GSON (as I use moshi) to make it working, so I made Kotlin method to form json string from remoteMessage's map, tested this on one example, so don't forget to test this implementation before using:
Edit:
Even better approach is to form FCM data like:
That way we can retreive both values from map.
We got clear json without "playing" around. And we can then use
notificationType
to convert json to the object that we need (as several notification data types can be passed sometimes)I have changed to
from
and work fine.
try this code:
Also make sure your JSON is valid use This
Faced this issue when migrating from GCM to FCM.
The following is working for my use case (and OP payload), so perhaps it will work for others.