Разбор вложенного массива JSON из данных уведомлений с использованием Gson в Android

Измените код в своем вопросе и сможете реплицировать вашу проблему. Это происходит из-за нового ограничения на использование http-соединений вместо https на iOS. Как я уже упоминал в своем комментарии, замена WWW на UnityWebRequest решена этой проблемой.

Кроме того, вы произвольно создаете новые текстуры каждый раз при выполнении new Texture2D(1280, 1280, TextureFormat.RGB24, false);. Это должно быть сделано с компонентом пользовательского интерфейса Unity RawImage. В этом случае нет лишнего выделения памяти.

Все, что вам нужно сделать для кода в вашем вопросе, - удалить API WWW и использовать UnityWebRequest. Также удалите Renderer или Texture2D и используйте RawImage для отображения вашей карты. Ниже приведен простой тестовый сценарий, который я использовал для проверки этого. Он работает как на Editor, iOS, так и на всех других платформах.

public class Gpsconnect : MonoBehaviour
{
    public RawImage imageDisp;
    public float fixLat = 42.3627f;
    public float fixLon = -71.05686f;
    public int zoom = 4;
    public string key = "";
    public Vector3 iniRef;
    public Transform cam;
    private Camera mycam;
    private string url = "";

    //Update Map with the corresponding map images for the current location ============================================
    IEnumerator load()
    {
        yield return null;
        mycam = Camera.main;
        fixLat = ((360 / Mathf.PI) * Mathf.Atan(Mathf.Exp(0.00001567855943f * (cam.position.z - 3 * mycam.orthographicSize / 2 + iniRef.z)))) - 90;
        fixLon = (18000 * (cam.position.x + iniRef.x)) / 20037508.34f;

        //MAP ================================================================================
        //Build a valid Google Maps tile request for the current location 

        url = "https://maps.google.com/maps/api/staticmap?center=" + fixLat + "," + fixLon + "&zoom=" + zoom + "&scale=2&size=640x640&style=feature:all|element:geometry|hue:0x00fff0|lightness:0|gamma:0.21|visibility:on&style=feature:all|element:labels|visibility:off&style=feature:landscape.man_made|element:geometry|color:0x133f42|visibility:on&style=feature:landscape.natural|element:geometry.fill|visibility:on|hue:0x00ffd2|saturation:35|lightness:0|gamma:0.5&style=feature:poi|element:geometry.fill|lightness:0|gamma:0.6|visibility:on&style=feature:poi.park|element:geometry|visibility:on|saturation:0|color:0x2e9470&style=feature:road|element:geometry.fill|visibility:on|color:0x05111a&style=feature:road|element:geometry.stroke|visibility:off&style=feature:transit|element:geometry|visibility:off" + "&sensor=false&key=" + key;

        UnityWebRequest www = UnityWebRequest.GetTexture(url);
        yield return www.Send();
        Debug.Log("Done: ");

        if (www.isError)
        {
            Debug.Log("Error while downloading image: " + www.error);
        }
        else
        {
            imageDisp.texture = ((DownloadHandlerTexture)www.downloadHandler).texture;
        }
    }

    void Start()
    {
        StartCoroutine(load());
    }
}
-1
задан Pratik Butani AndroidDev 29 March 2019 в 12:50
поделиться

2 ответа

Это просто, у вас должен быть просто абстрактный объект Notification с атрибутами alert, title и notification_type. И затем, пока у вас есть конкретные реализации, основанные на ваших возможных типах:

  • AcceptRequestNotification extends Notification только с int booking_id (это у вас уже есть, тот, который вы назвали CommonNotificationBean) 1113]
  • EndRequestNotification extends Notification, который содержит, например, ArrayList с именем servicesList, этот ArrayList должен иметь тип Service, и тогда служба будет иметь атрибуты: service_id, service_name, status, sub_category, который снова является другим ArrayList пользовательского типа.

И тогда вы просто измените свой код на:

// 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);

    Class typeOf;

    switch(remoteMessage.getData().get("notification_type")) {
        case "accept_request":
            typeOf = AcceptRequestNotification.class;
        break;
        case "end_request":
            typeOf = EndRequestNotification.class;
        break;
    }

    //you can cast this object later on (to the corresponding custom subclass of Notification), based on the notif.getNotificationType() value.
    Notification notif = gson.fromJson(reader, typeOf);

    sendNotification(notif);
}
0
ответ дан Hugo Allexis Cardona 29 March 2019 в 12:50
поделиться

И, наконец, я нашел решение, добавив несколько понятий. :)

У меня много проблем с преобразованием в JSON с правильным форматом, например:

  • Неопределенный объект в символе
  • MalformedJsonException

и, наконец, следующий код работает для меня.

  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() : {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()) : {"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"}

[1119 ] Окончательный 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

Надеюсь, это поможет другим.

0
ответ дан Pratik Butani AndroidDev 29 March 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: