如何从 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)
}
我正在尝试从以下 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)
}