2017-02-16 7 views
2

Я использую FCM для push-сообщений и обработки всех входящих push-уведомлений в onMessageReceived. Теперь проблема заключается в разборке вложенного json, который входит в эту функцию. remoteMessage.getData()не удалось разобрать блок json для json в android для FCM

У меня есть следующий блок, следующий как push-уведомление в устройстве. содержание полезных данных может быть изменено здесь дилер позже это может быть productInfo

{ 
    "to": "/topics/DATA", 
    "priority": "high", 
    "data": { 
    "type": 6, 
    "dealerInfo": { 
     "dealerId": "358", 
     "operationCode": 2 
    } 
    } 
} 

это, как я разбор его

if(remoteMessage.getData()!=null){ 

     JSONObject object = null; 
     try { 
      object = new JSONObject(remoteMessage.getData());  

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 


    } 

теперь я получаю данные с blackslashes, как remoteMessage.getData() возвращается Map<String,String> так, вероятно, однако мой вложенный блок преобразовывается в строку, но не уверен.

{ 
    "wasTapped": false, 
    "dealerInfo": "{\"dealerId\":\"358\",\"operationCode\":2}", 
    "type": "6" 
} 

и если я пишу object = new JSONObject(remoteMessage.getData().toString()); тогда он получил неудачу с последующим уведомлением

{ 
    "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" 
    } 
} 

ошибка я получаю

> org.json.JSONException: Unterminated object at character 15 of 
> {body=Message Body, type=1, title=Call Status, callNumber=ICI17012702, 
> callTempId=0} 

ответ

0

попробовать этот код:

public void onMessageReceived(RemoteMessage remoteMessage) 
    { 
     Log.e("DATA",remoteMessage.getData().toString()); 
     try 
     { 
      Map<String, String> params = remoteMessage.getData(); 
      JSONObject object = new JSONObject(params); 
      Log.e("JSON OBJECT", object.toString()); 
      String callNumber = object.getString("callNumber"); 
      //rest of the code 
     } 
    } 

Также убедитесь, что ваш JSON действителен. This

+0

не представляется возможным так, как бы я получить доступ к dealerInfo часть – Hunt

+0

Вложенный объект все еще остается строка в этом случае , –

+0

@ Абхинав, что это значит? ответ работает ... дайте веские основания для downvote ...! ответ может не работать для u ... так что вы можете добавить свою собственную версию, а не царапать другую спину .... – rafsanahmad007

1

Столкнувшись с проблемой при переходе с GCM на FCM.

Следующее работает для моего варианта использования (и полезной нагрузки OP), поэтому, возможно, это сработает для других.

JsonObject jsonObject = new JsonObject(); // com.google.gson.JsonObject 
JsonParser jsonParser = new JsonParser(); // com.google.gson.JsonParser 
Map<String, String> map = remoteMessage.getData(); 
String val; 

for (String key : map.keySet()) { 
    val = map.get(key); 
    try { 
     jsonObject.add(key, jsonParser.parse(val)); 
    } catch (Exception e) { 
     jsonObject.addProperty(key, val); 
    } 
} 

// Now you can traverse jsonObject, or use to populate a custom object: 
// MyObj o = new Gson().fromJson(jsonObject, MyObj.class) 
0

Я изменил к

JSONObject = новый JSON JSONObject (remoteMessage.getData());

от

JSONObject = новый JSON JSONObject (. RemoteMessage.getData() ToString());

и работа хорошо.

0

Поскольку dealerInfo обрабатывается как строка, а не объект, создать новый JSONObject со строкой

JSONObject dealerInfo = new JSONObject(object.getString("dealerInfo")); 
String dealerId = dealerInfo.getString("dealerId"); 
String operationCode = dealerInfo.getString("operationCode");