在Android中使用Gson从通知数据解析嵌套的JSON数组 [英] Parse Nested JSON Array from Notification Data using Gson in Android

查看:216
本文介绍了在Android中使用Gson从通知数据解析嵌套的JSON数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在从FCM通知中获取JSON格式的数据.根据通知类型,它具有不同的格式,如下所示:

I am getting data in JSON format from FCM notification. It has different format based on notification types as below:

格式1:accept_request:

{
   "alert": "Accept Request By driver",
   "title": "Accept Request By driver",
   "booking_id": "247",
   "notification_type": "accept_request"
}

格式2:end_request:

{
    "alert": "End trip By driver",
    "title": "End trip By driver",
    "booking_id": "247",
    "notification_type": "end_request",
    "servicesList": [
        {
            "service_id": "1",
            "service_name": "Services1",
            "status": "true",
            "sub_category": [
                {
                    "sub_cat_id": "1",
                    "sub_cat_name": "Doctors on call",
                    "service_cost": "15.00",
                    "service_cat_id": "1",
                    "cost": 0
                }
            ],
            "is_multiple_choose": "0",
            "total_cost": 15
        }
}

我已经创建了CommonNotificationBean.java作为POJO类.我已经成功解析了accept_request的数据.

I have create CommonNotificationBean.java as POJO class. I have successfully parsed data for accept_request.

之所以起作用,是因为所有键都具有String值,并且remoteMessage.getData()还会返回Map<String, String>类型的值.

Its working because all key has String values and remoteMessage.getData() also returning Map<String, String> type values.

代码:

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData().get("notification_type"));
        Map<String, String> params = remoteMessage.getData();

        JSONObject object = new JSONObject(params);

        Gson gson = new Gson();
        JsonReader reader = new JsonReader(new StringReader(object.toString()));
        reader.setLenient(true);
        CommonNotificationBean bean = gson.fromJson(reader, CommonNotificationBean.class);

        sendNotification(bean);
    }

问题:

现在,我在解析end_request数据时遇到问题,因为它具有嵌套的JSON数组.

PROBLEM:

Now I am stuck with problem while parsing end_request data because it has Nested JSON Array.

我该如何处理动态数据而不是Map<String, String> ,因为它不会将数据转换为Map<String, String>类型,因为它具有某些List类型值.

What can I do for dynamic data instead of Map<String, String> because it will not convert data into Map<String, String> type as it has some List type values.

任何人都可以帮忙吗?

推荐答案

最后,我通过添加一些概念获得了解决方案. :)

And finally I got solution by adding some drops of concepts. :)

在以正确的格式进行JSON转换时,我遇到很多问题:

I got many problems to converting in JSON with proper format like:

  • 字符处未终止的对象
  • MalformedJsonException

最后,下面的代码对我有用.

and Finally following code get worked for me.

  if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "remoteMessage.getData() : " + remoteMessage.getData());

        // Map<String, String> stringStringMap = remoteMessage.getData();

        JSONObject object = new JSONObject(remoteMessage.getData());

        Log.d(TAG, "new JSONObject(remoteMessage.getData()) : " + object.toString());

        String finalJSON = object.toString().replaceAll("\\\\", "").replace("\"[", "[").replace("]\"", "]");

        Log.d(TAG, "Replace all back slash and invalid double quotes : " + finalJSON);

        CommonNotificationBean bean = new Gson().fromJson(finalJSON, CommonNotificationBean.class);

        sendNotification(bean);
    }

Logcat:

remoteMessage.getData():获取不带双引号的数据.

remoteMessage.getData(): Getting data without double quotes.

remoteMessage.getData() : {content-available=1, notification_type=end_request, booking_id=247, priority=high, base_price=35, totalMinutePrice=1.5, alert=End trip By driver, sound=default, title=End trip By driver, total_amount=397, address_from=A/ 4 forum bungalow Nr. Hicort, Sola, Ahmedabad, Gujarat 380015, India, service_cost=360, servicesList=[{"total_cost":15,"sub_category":[{"cost":0,"sub_cat_name":"Doctors on call","sub_cat_id":"1","service_cost":"15.00","service_cat_id":"1"}],"service_name":"Services1","service_id":"1","is_multiple_choose":"0","status":"true"},{"total_cost":95,"sub_category":[{"cost":0,"sub_cat_name":"Hand","sub_cat_id":"3","service_cost":"20.00","service_cat_id":"2"},{"cost":0,"sub_cat_name":"Body","sub_cat_id":"4","service_cost":"75.00","service_cat_id":"2"}],"service_name":"Dressing","service_id":"2","is_multiple_choose":"1","status":"true"},{"total_cost":0,"sub_category":[{"cost":0,"sub_cat_name":"No","sub_cat_id":"7","service_cost":"0.00","service_cat_id":"3"}],"service_name":"Do you need oxygen?","service_id":"3","is_multiple_choose":"0","status":"true"},{"total_cost":30,"sub_category":[{"cost":0,"sub_cat_name":"Level 3","sub_cat_id":"10","service_cost":"30.00","service_cat_id":"4"}],"service_name":"Lift\/Stairs Accessibility","service_id":"4","is_multiple_choose":"0","status":"true"},{"total_cost":220,"sub_category":[{"cost":0,"sub_cat_name":"Ventilator","sub_cat_id":"12","service_cost":"100.00","service_cat_id":"5"},{"cost":0,"sub_cat_name":"Intracenous (IV) drip","sub_cat_id":"13","service_cost":"120.00","service_cat_id":"5"}],"service_name":"Other Medical","service_id":"5","is_multiple_choose":"1","status":"true"},{}], tripdatetime=2019-03-27 10:57:51, address_to=19/20, Chanakyapuri, Ahmedabad, Gujarat 382481, India, notification_date_time=28-03-2019 17:24:09}

新的JSONObject(remoteMessage.getData()):转换为JSONObject,但获取了不必要的反斜杠和双引号

new JSONObject(remoteMessage.getData()) : Converted to JSONObject but getting unwanted back slash and double quotes

new JSONObject(remoteMessage.getData()) : {"content-available":"1","notification_type":"end_request","booking_id":"247","priority":"high","base_price":"35","totalMinutePrice":"1.5","alert":"End trip By driver","sound":"default","title":"End trip By driver","total_amount":"397","address_from":"A\/ 4 forum bungalow Nr. Hicort, Sola, Ahmedabad, Gujarat 380015, India","service_cost":"360","servicesList":"[{\"total_cost\":15,\"sub_category\":[{\"cost\":0,\"sub_cat_name\":\"Doctors on call\",\"sub_cat_id\":\"1\",\"service_cost\":\"15.00\",\"service_cat_id\":\"1\"}],\"service_name\":\"Services1\",\"service_id\":\"1\",\"is_multiple_choose\":\"0\",\"status\":\"true\"},{\"total_cost\":95,\"sub_category\":[{\"cost\":0,\"sub_cat_name\":\"Hand\",\"sub_cat_id\":\"3\",\"service_cost\":\"20.00\",\"service_cat_id\":\"2\"},{\"cost\":0,\"sub_cat_name\":\"Body\",\"sub_cat_id\":\"4\",\"service_cost\":\"75.00\",\"service_cat_id\":\"2\"}],\"service_name\":\"Dressing\",\"service_id\":\"2\",\"is_multiple_choose\":\"1\",\"status\":\"true\"},{\"total_cost\":0,\"sub_category\":[{\"cost\":0,\"sub_cat_name\":\"No\",\"sub_cat_id\":\"7\",\"service_cost\":\"0.00\",\"service_cat_id\":\"3\"}],\"service_name\":\"Do you need oxygen?\",\"service_id\":\"3\",\"is_multiple_choose\":\"0\",\"status\":\"true\"},{\"total_cost\":30,\"sub_category\":[{\"cost\":0,\"sub_cat_name\":\"Level 3\",\"sub_cat_id\":\"10\",\"service_cost\":\"30.00\",\"service_cat_id\":\"4\"}],\"service_name\":\"Lift\\\/Stairs Accessibility\",\"service_id\":\"4\",\"is_multiple_choose\":\"0\",\"status\":\"true\"},{\"total_cost\":220,\"sub_category\":[{\"cost\":0,\"sub_cat_name\":\"Ventilator\",\"sub_cat_id\":\"12\",\"service_cost\":\"100.00\",\"service_cat_id\":\"5\"},{\"cost\":0,\"sub_cat_name\":\"Intracenous (IV) drip\",\"sub_cat_id\":\"13\",\"service_cost\":\"120.00\",\"service_cat_id\":\"5\"}],\"service_name\":\"Other Medical\",\"service_id\":\"5\",\"is_multiple_choose\":\"1\",\"status\":\"true\"},{}]","tripdatetime":"2019-03-27 10:57:51","address_to":"19\/20, Chanakyapuri, Ahmedabad, Gujarat 382481, India","notification_date_time":"28-03-2019 17:24:09"}

最终JSON:

Replace all back slash and invalid double quotes : {"content-available":"1","notification_type":"end_request","booking_id":"247","priority":"high","base_price":"35","totalMinutePrice":"1.5","alert":"End trip By driver","sound":"default","title":"End trip By driver","total_amount":"397","address_from":"A/ 4 forum bungalow Nr. Hicort, Sola, Ahmedabad, Gujarat 380015, India","service_cost":"360","servicesList":[{"total_cost":15,"sub_category":[{"cost":0,"sub_cat_name":"Doctors on call","sub_cat_id":"1","service_cost":"15.00","service_cat_id":"1"}],"service_name":"Services1","service_id":"1","is_multiple_choose":"0","status":"true"},{"total_cost":95,"sub_category":[{"cost":0,"sub_cat_name":"Hand","sub_cat_id":"3","service_cost":"20.00","service_cat_id":"2"},{"cost":0,"sub_cat_name":"Body","sub_cat_id":"4","service_cost":"75.00","service_cat_id":"2"}],"service_name":"Dressing","service_id":"2","is_multiple_choose":"1","status":"true"},{"total_cost":0,"sub_category":[{"cost":0,"sub_cat_name":"No","sub_cat_id":"7","service_cost":"0.00","service_cat_id":"3"}],"service_name":"Do you need oxygen?","service_id":"3","is_multiple_choose":"0","status":"true"},{"total_cost":30,"sub_category":[{"cost":0,"sub_cat_name":"Level 3","sub_cat_id":"10","service_cost":"30.00","service_cat_id":"4"}],"service_name":"Lift/Stairs Accessibility","service_id":"4","is_multiple_choose":"0","status":"true"},{"total_cost":220,"sub_category":[{"cost":0,"sub_cat_name":"Ventilator","sub_cat_id":"12","service_cost":"100.00","service_cat_id":"5"},{"cost":0,"sub_cat_name":"Intracenous (IV) drip","sub_cat_id":"13","service_cost":"120.00","service_cat_id":"5"}],"service_name":"Other Medical","service_id":"5","is_multiple_choose":"1","status":"true"},{}],"tripdatetime":"2019-03-27 10:57:51","address_to":"19/20, Chanakyapuri, Ahmedabad, Gujarat 382481, India","notification_date_time":"28-03-2019 17:24:09"}

完整代码: MyFirebaseMessagingService.java

希望对其他人有帮助.

Full code : MyFirebaseMessagingService.java

Hope it will be help to others.

这篇关于在Android中使用Gson从通知数据解析嵌套的JSON数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆