Анализ сообщений FCM в класс Java с помощью GSON

Я пытаюсь разобрать сообщение FCM и построить объект java

В FirebaseMessageServiceполезной нагрузке разбирается следующим образом

// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
    Log.v(TAG, "Message data payload: " + remoteMessage.getData());

    Map<String, String> params = remoteMessage.getData();
    JSONObject object = new JSONObject(params);
    Log.v(">>JSON_OBJECTTOSTRING ", object.toString())

Полученная строка {"message":"[{"mName":"Milk","mUnit":"1 Litre"},{"mName":"curd","mUnit":"1 Litre"}]"}

Выше строка анализируется как ниже в другом классе

JsonObject jo = new JsonParser().parse(order).getAsJsonObject();
JsonArray jsonArray = jo.getAsJsonArray("message");
itemList = new Gson().fromJson(jsonArray, GroceryItem[].class);

Получение этой ошибки при получении в виде массива, вызванного:

Ява.ленг.ClassCastException: com.гуглить.gson.Jsonprimitive нельзя привести к com.гуглить.gson.JsonArray

не могли бы вы мне помочь?

1 ответ

  1. JSON содержит внутренний JSON, закодированный в виде строки. Если вы внимательно посмотрите на messageсвойство, вы увидите, что вы должны разобрать его снова. Скажем:

    final Gson gson = new Gson();
    final JsonParser jsonParser = new JsonParser();
    // get the outer root the way you already do
    final JsonObject outerRoot = jsonParser.parse(JSON).getAsJsonObject();
    // pick the inner JSON as a string
    final String innerJson = outerRoot.get("message").getAsJsonPrimitive().getAsString();
    // and now you can parse it as a regular JSON
    final JsonArray innerRoot = jsonParser.parse(innerJson).getAsJsonArray();
    final GroceryItem[] groceryItems = gson.fromJson(innerRoot, GroceryItem[].class);
    out.println(Arrays.toString(groceryItems));
    

    И выход (предполагаяGroceryItem.toString(), что метод определен каким-то образом):

    [GroceryItem{mName= ‘молоко’, mUnit=’1 литр’}, GroceryItem{mName= ‘творог’, mUnit= ‘1 литр’}]