Разобрать Bundle, который является JSONString в объекте Remotemessage для JSON

Я пытаюсь проанализировать данные уведомления в FCM. Я постараюсь объяснить свою проблему настолько подробно, насколько смогу. У меня есть два приложения: одно для Android, а другое для веб-приложения с javascript. поэтому при отправке push-уведомлений из веб-приложения в приложение для Android я отправляю данные уведомления в формате jsonstring. Теперь я не могу преобразовать его в JSONObject на стороне Java (Android). Ниже мой код

    var notification = {
    'TITLE': currentUser.displayName,
    'MSG': message,
    'CHAT_KEY': chatKey,
    'MSG_KEY': 'messageKey',
    'USER_DISPLAY_NAME': currentUser.displayName,
    'USER_EMAIL': currentUserEmail, 
    'USER_FCM_DEVICE_ID': toKey,
    'USER_FCM_DEVICE_ID_SENDER': fromKey,
  };

  fetch('https://fcm.googleapis.com/fcm/send', {
    'method': 'POST',
    'headers': {
      'Authorization': 'key=' + fromKey,
      'Content-Type': 'application/json'
    },
    'body': JSON.stringify({
      'notification': notification,
      'to': toKey
    })
  }).then(function(response) {
    console.log(response);
  }).catch(function(error) {
    console.error(error);
  })
};

И на стороне андроида

@Override public void onMessageReceived(RemoteMessage remoteMessage) {

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


        sendDefaultNotification(remoteMessage.getNotification().getTitle(),
                remoteMessage.getNotification().getBody());
    } else {
        String currentUserEmail = "";
        FirebaseAuth auth = FirebaseAuth.getInstance();
        if (auth.getCurrentUser() != null && auth.getCurrentUser().getEmail() != null) {
            currentUserEmail = auth.getCurrentUser().getEmail();
        }

        String userName = remoteMessage.getData().get(Constants.KEY_USER_DISPLAY_NAME);
        String userEmail = remoteMessage.getData().get(Constants.KEY_USER_EMAIL);
        String chatKey = remoteMessage.getData().get(Constants.KEY_CHAT_KEY);
        String deviceId = remoteMessage.getData().get(Constants.KEY_USER_FCM_DEVICE_ID);
        String deviceIdSender = remoteMessage.getData().get(Constants.KEY_USER_FCM_DEVICE_ID_SENDER);
        String title = remoteMessage.getData().get(Constants.KEY_MSG_TITLE);
        String msg = remoteMessage.getData().get(Constants.KEY_MSG);
        String msgKey = remoteMessage.getData().get(Constants.KEY_MSG_KEY);

        /*if (chatKey.equals(ConstantsFirebase.FIREBASE_LOCATION_CHAT_GLOBAL)) {
            title = String.format("%s- %s", title, ConstantsFirebase.CHAT_GLOBAL_HELPER);
        } else {*/
            if (!currentUserEmail.equals(Utils.decodeEmail(userEmail))) {
                setMessageReceived(FirebaseDatabase.getInstance().getReference()
                        .child(ConstantsFirebase.FIREBASE_LOCATION_CHAT).child(chatKey).child(msgKey)
                        .child(ConstantsFirebase.FIREBASE_PROPERTY_MESSAGE_STATUS));
            }
      /*  }*/

        boolean notificationIsActive = PreferenceManager.getDefaultSharedPreferences(this)
                .getBoolean(Constants.KEY_PREF_NOTIFICATION, false);
        if (auth.getCurrentUser() != null && notificationIsActive) {
            if (!currentUserEmail.equals(Utils.decodeEmail(userEmail))) {

                Utils.setAdditionalData(new PushNotificationObject
                        .AdditionalData(title, msg, chatKey, msgKey, userName,
                        userEmail, deviceId, deviceIdSender));
                sendNotification(title, msg);
            }
        }
    }
}

Здесь я рассматриваю Remotemessage непосредственно как JSONObject, но он входит в пакет jsonstring. Как мне его разобрать?

Выход:

Bundle[{gcm.notification.USER_DISPLAY_NAME=ishku sukshi, google.sent_time=1512190657773, gcm.notification.TITLE=ishku sukshi, gcm.notification.USER_FCM_DEVICE_ID=fXLDo7zU7c0:APA91bFx0sIGwIZ9jIm7xi7QvSrWKrL29uWJnNT0jujlyVHTScUteuRZ37nB-FgEeBXokZdQfmyGKhhRLjCILraS8sTif4p6DRJ_jZkNlh-J_yhKTAU3WnBYzGBtlaTorcAJhDtd1AIy, gcm.notification.CHAT_KEY=-L-FVx8eZBuz-QIsnXvx, from=1028795933953, gcm.notification.USER_EMAIL=ishkumihu@gmail,com, google.message_id=0:1512190657780774%bfd1fc79bfd1fc79, gcm.notification.MSG_KEY=messageKey, gcm.notification.MSG=, gcm.notification.USER_FCM_DEVICE_ID_SENDER=AAAA74kEJQE:APA91bHN5lJf0S8KNXzhU4XL1rz1rqyZ6ziY4UghZudtW6iH84ytQksWMSvSKsaBqQEsw7P2txk-yTGp5DOYElb7pdg8VFgj8wecJUcsPKJ6JCASCO_ihXh6xpo3a2aDuw8HnHPvL0Mr, collapse_key=com.sukshi.sukshichat}]

На самом деле gcm.notification, добавляющий каждый ключ, также не должен приходить, я не знаю, почему это происходит.

введите здесь описание изображения


person Stackover67    schedule 02.12.2017    source источник
comment
Какую ошибку вы получаете? Вы хотите преобразовать удаленное сообщение в JSONObject? На самом деле вам это не нужно, вы также можете получить значение JSON в этом случае?   -  person M. Oguz Ozcan    schedule 02.12.2017
comment
Но данные, которые я получаю, имеют формат JSONSTRING. Как я могу получить значения json из jsonstring?   -  person Stackover67    schedule 02.12.2017
comment
Вам нужно иметь JSON или вам нужны только значения. String userName = data.get(Constants.KEY_USER_DISPLAY_NAME.name()).toString() это может сработать для вас?   -  person M. Oguz Ozcan    schedule 02.12.2017
comment
Мне нужно иметь json   -  person Stackover67    schedule 02.12.2017
comment
Пожалуйста, напечатайте remoteMessge#getData() и добавьте вывод в вопрос, чтобы мы могли видеть, какой тип данных вы получаете. Если это строка json, вы можете преобразовать ее в объект JSON, используя: JSONObject jsonObj = new JSONObject(jsonStr);   -  person dpaksoni    schedule 02.12.2017
comment
@dpaksoni Я отредактировал очередь со своим выводом. Пожалуйста, взгляните на это.   -  person Stackover67    schedule 02.12.2017


Ответы (2)


Попробуйте сделать JSONObject из строкового представления json. Измените notification на data в коде на стороне сервера. Нравиться -

fetch('https://fcm.googleapis.com/fcm/send', {
    'method': 'POST',
    'headers': {
      'Authorization': 'key=' + fromKey,
      'Content-Type': 'application/json'
    },
    'body': JSON.stringify({
      'data': notification,
      'to': toKey
    })
  }).then(function(response) {
    console.log(response);
  }).catch(function(error) {
    console.error(error);
  })
};

И получите свое сообщение fcm на стороне Android -

String body = remoteMessage.getData();
JSONObject json = new JSONObject(body );
Log.d("json", json.toString());

Затем вы можете получить значение по ключу, назначенному из javascript. Нравится - json.get("USER_DISPLAY_NAME");

И дай мне знать, как дела.

person AGM Tazim    schedule 02.12.2017
comment
Попытка вызвать виртуальный метод 'java.lang.String com.google.firebase.messaging.RemoteMessage$Notification.getBody()' для ссылки на нулевой объект. Это ошибка, которую я получаю, если реализую ваш способ. - person Stackover67; 02.12.2017
comment
можешь выложить что remoteMessage.getNotification() с toString() дает? - person AGM Tazim; 02.12.2017
comment
можно ли связаться с вами лично? Как в скайпе или видеовстречах? Я боролся с этой проблемой в течение последних 3 дней - person Stackover67; 02.12.2017

На самом деле вы получаете объект Map из метода RemoteMessage#getData(). Итак, если вам нужен объект json, вы можете создать его самостоятельно, как показано ниже.

JSONObject json = new JSONObject();
//data is RemoteMessage#getData();
Set<String> keys = data.keySet();
for (String key : keys) {
    try {
       json.put(key, JSONObject.wrap(data.get(key)));
    } catch(JSONException e) {
        //Handle exception here
  }
}
person dpaksoni    schedule 02.12.2017
comment
Пожалуйста, примите ответ, если он действительно решил вашу проблему. - person dpaksoni; 02.12.2017
comment
Используя это, я получаю ключи = 0. Я добавляю изображение своего вывода на изображение. - person Stackover67; 02.12.2017