如何从 android 中的原始负载中提取值?

How to extract value from raw payload in android?

我正在尝试从以下 JSON 中提取 google.sent_time ,如何获取该值?
它似乎是一个原始的有效载荷,而且并不简单JSON,所以想知道是否有办法提取它?

{
  "notificationID": "677291f5-a784-43df-af2e-0067e9c",
  "title": "test 223",
  "body": "payload",
  "lockScreenVisibility": 1,
  "groupMessage": "",
  "fromProjectNumber": "819539062812",
  "priority": 5,
  "rawPayload": "{\"google.delivered_priority\":\"normal\",\"google.sent_time\":1591849563191,\"google.ttl\":259200,\"google.original_priority\":\"normal\",\"custom\":\"{\\"i\\":\\"677291f5-a784-43df-af2e-0363a4067e9c\\"}\",\"oth_chnl\":\"\",\"pri\":\"5\",\"vis\":\"1\",\"from\":\"819539062812\",\"alert\":\"payload\",\"title\":\"test 223\",\"grp_msg\":\"\",\"google.message_id\":\"0:1591849563205759%409ebbcaf9fd7ecd\",\"google.c.sender.id\":\"819539062812\",\"notificationId\":-1451117355}"
}

它是 JSON,其中一些字符被转义,因此它可以适合您的主 JSON 中的字符串类型字段。

您可以将 "rawPayload" 字段的字符串值提取到您正在使用的任何 JSON 解析器,或者您可以直接在字符串上使用正则表达式来获取值:

这是一个正则表达式示例:

Pattern p = Pattern.compile("google\.sent_time.*:(\d+)");
Matcher m = p.matcher(yourInputString);
m.find();
String sentTime = m.group(1);

从原始 JSON 中获取字符串形式的 rawPayload 值并再次将其环绕在 JSONObject 周围:

public static void main(String[] args) throws Exception {
    String str = "...";     // JSON string here
    
    JSONObject json = new JSONObject(str);
    
    JSONObject payload = new JSONObject(json.getString("rawPayload"));
    System.out.println(payload.toString());
}

输出:

{
   "google.delivered_priority":"normal",
   "google.sent_time":1591849563191,
   "google.ttl":259200,
   "google.original_priority":"normal",
   "custom":"{\"i\":\"677291f5-a784-43df-af2e-0363a4067e9c\"}",
   "oth_chnl":"",
   "pri":"5",
   "vis":"1",
   "from":"819539062812",
   "alert":"payload",
   "title":"test 223",
   "grp_msg":"",
   "google.message_id":"0:1591849563205759%409ebbcaf9fd7ecd",
   "google.c.sender.id":"819539062812",
   "notificationId":-1451117355
}

示例使用 org.json 库。

使用 Gson json 解析器。它所做的是将您的 json 数据映射到 POJO class。但是因为你不关心其他项目或者你不想使用 Gson 你必须去:

    JSONObject obj = new 
  JSONObject(YOUR_JSON_DATA);
   JSONObject notiObj = 
  obj.getJSONObject("rawPayload");
  String sentTime =  notiObj.getString("google.sent_time);

干杯!

rawPayload 看起来像一个有效的 JSON,您可以使用任何在线 json 格式化程序来检查它。 你可以试试这个:

val str = "{\"google.delivered_priority\":\"normal\",\"google.sent_time\":1591849563191,\"google.ttl\":259200,\"google.original_priority\":\"normal\",\"custom\":\"{\\"i\\":\\"677291f5-a784-43df-af2e-0363a4067e9c\\"}\",\"oth_chnl\":\"\",\"pri\":\"5\",\"vis\":\"1\",\"from\":\"819539062812\",\"alert\":\"payload\",\"title\":\"test 223\",\"grp_msg\":\"\",\"google.message_id\":\"0:1591849563205759%409ebbcaf9fd7ecd\",\"google.c.sender.id\":\"819539062812\",\"notificationId\":-1451117355}"

    try {
        val key = "google.sent_time"
        val json = JSONObject(str)
        Log.i(javaClass.simpleName, "key = ${json[key]}")
    } catch (e: Exception) {
        Log.e(javaClass.simpleName, "failed :", e)
    }