【问题标题】:How to extract value from raw payload in android?如何从android中的原始有效负载中提取价值?
【发布时间】:2020-06-11 10:16:32
【问题描述】:

我正在尝试从以下 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 对象 - 解析外部对象,抓取字符串,也将其解析为 JSON

标签: java android android-json android-parser


【解决方案1】:

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

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

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

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

【讨论】:

  • 这个正则表达式有问题吗? ddoesnt 为我工作,给我一个关于正则表达式不正确的错误
  • @AngelaHeely 是的,看起来我忘记了反斜杠 \ 并且忘记在获取组之前致电 find。我修复了代码并使用您的示例输入对其进行了测试,它现在应该可以工作了。
  • 您对此有什么想法吗:stackoverflow.com/questions/62377933/…
【解决方案2】:

从原始 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 库用于示例。

【讨论】:

    【解决方案3】:

    使用 Gson json 解析器。它的作用是将您的 json 数据映射到 POJO 类。但是由于您不关心其他项目或者您不想使用 Gson,您将不得不离开:

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

    干杯!

    【讨论】:

    • 这不起作用。我回来了一个崩溃:.NullPointerException:尝试调用虚拟方法'org.json.JSONObject org.json.JSONObject.getJSONObject(java.lang.String)'
    【解决方案4】:

    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)
        }
    

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2016-11-08
      • 1970-01-01
      • 2018-01-12
      • 2017-05-18
      相关资源
      最近更新 更多