2017-01-14 13 views
0

Я пытаюсь разобрать сообщение ТСМ и построить объект JavaFCM сообщение разбора класса Java с помощью GSON

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

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

java.lang.ClassCastException: com.google.gson.JsonPrimitive не может быть приведен к com.google.gson.JsonArray

может ты помог мне?

+0

Ваша строка json неверна. Строка Json должна быть такой '{\" message \ ": [{\" mName \ ": \" Milk \ ", \" mUnit \ ": \" 1 Liter \ "}, {\" mName \ ": \ "curd \", \ "mUnit \": \ "1 Liter \"}]} '. Я проанализировал эту строку json. Оно работает. – atiqkhaled

ответ

0

Ваш 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 = 'curd', mUnit = '1 Liter'}]

+0

Это работает, спасибо – Nimble