如何匹配带动态后缀的JSON Key以获取mediaFit字段值?
解决动态JSON Key(以media_id_开头)的mediaFit字段获取问题
你当前代码的核心错误是:遍历到符合条件的media_id_xxx类型Key后,没有使用匹配到的动态Key名称去获取对应的子JSON对象,而是错误地用了固定字符串"media_id",导致无法定位目标字段。
修正后的完整代码
JSONObject jsonObject = new JSONObject(templatePreviewElements.getPreviewSrcUrl().getAttribute("text")); System.out.println(jsonObject); JSONArray jsonArray = jsonObject.getJSONArray("pages"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject pageObject = jsonArray.getJSONObject(i); // 提前获取当前页对象,避免重复调用 for (Object key : pageObject.keySet()) { String keyStr = (String) key; // 精准匹配以media_id_开头的Key if (keyStr.startsWith("media_id_")) { // 使用匹配到的动态Key获取子对象 JSONObject mediaObject = pageObject.getJSONObject(keyStr); String actualEffect = mediaObject.getString("mediaFit"); System.out.println("Actual Selected Text Effect: " + actualEffect); System.out.println("Expected Selected Text Effect: " + mediaEffect); assertEquals(actualEffect, mediaEffect); System.out.println("匹配到符合条件的Key: " + keyStr); } } }
关键优化说明
- 精准匹配Key:用
keyStr.startsWith("media_id_")替代contains,避免误匹配到包含media_id但不符合开头规则的Key;如果需要严格限制后缀为数字,可改用正则匹配:if (keyStr.matches("^media_id_\\d+$")) { // 逻辑代码 } - 减少重复调用:提前将当前页的JSONObject赋值给
pageObject,避免循环中重复执行jsonObject.getJSONArray("pages").getJSONObject(i),提升代码效率和可读性 - 使用动态Key:核心修正点——直接用匹配到的
keyStr作为参数调用getJSONObject,而非固定字符串"media_id"
示例JSON
"media_id_1696320854359": { "resourceId": "HzXvCFvKQWrf9hpfMi2u3smsvziXpz2Vazvr", "groupId": "9ff31635-b440-41b2-b147-792aed6e5529", "orignalId": "HzXvCFvKQWrf9hpfMi2u3smsvziXpz2Vazvr", "orignalWidth": 1584, "orignalHeight": 1920, "horizontal": { "height": 1080, "width": 891, "top": 0, "left": 514.5 }, "vertical": {}, "custom": {}, "type": "img", "kenBurns": "forced", "mediaFit": "fill", "mediaAlign": "center", "tags": [], "name": "helmet.jpg", "height": 1920, "width": 1584, "modifiedAt": "2023-09-28T14:52:31.214Z", "userId": "9ff31635-b440-41b2-b147-792aed6e5529" }
内容的提问来源于stack exchange,提问作者ccnc
相关产品推荐
相关产品推荐

