【问题标题】:How to pull a section of a JSON array?如何提取 JSON 数组的一部分?
【发布时间】:2014-11-25 19:50:48
【问题描述】:

大家好,我真的需要帮助。

我的 JSON 提要给了我这个键/值对:

"custom_fields":{"zn_meta_elements":["a:8:{s:7:\"sp_link\";a:2:{s:3:\"url\";s:0:\"\";s:6:\"target\";s:6:\"_blank\";}s:6:\"sp_col\";s:0:\"\";s:14:\"sp_show_social\";s:3:\"yes\";s:10:\"port_media\";a:1:{i:0;a:3:{s:20:\"dynamic_element_type\";s:10:\"port_media\";s:21:\"port_media_image_comb\";a:3:{s:5:\"image\";s:0:\"\";s:3:\"alt\";s:0:\"\";s:5:\"title\";s:0:\"\";}s:21:\"port_media_video_comb\";s:26:\"http:\/\/vimeo.com\/112591203\";}}s:15:\"page_title_show\";s:3:\"yes\";s:10:\"page_title\";s:0:\"\";s:13:\"page_subtitle\";s:0:\"\";s:20:\"zn_disable_subheader\";s:2:\"no\";}"]}

我想从中获取值的变量是port_media_video_comb 所以我想把http:\/\/vimeo.com\/112591203\部分拉出来,变成一个可用的url。

我目前用来提取信息的代码如下所示:

jQuery.each(data.posts, function(i, item) {
   html += '<li>';
   html += '<div class="entry"><img src="' + data.posts[i].thumbnail + '" width="50px" height="50px" style="float:left; padding-right: 5px;"><a href="' + data.posts[i].url +'" target="_blank">' + data.posts[i].title + '</a><br /><p>' + data.posts[i].date + '</div>' ;
   html += '</li>';
});

我会喜欢data.posts[i].custom_fields.port_media_video_comb,但是我如何确保它可以作为 url 工作?我将在&lt;iframe&gt; 标签中使用它。

感谢任何帮助!


编辑:

好的,所以我使用了这个网站:http://json.parser.online.fr/ 为了帮助我找出我需要抓取的元素的种类。

我发现我可以像这样访问字符串: data.posts[i].custom_fields.zn_meta_elements 并返回: "a:8:{s:7:\"sp_link\";a:2:{s:3:\"url\";s:0:\"\";s:6:\"target\";s:6:\"_blank\";}s:6:\"sp_col\";s:0:\"\";s:14:\"sp_show_social\";s:3:\"yes\";s:10:\"port_media\";a:1:{i:0;a:3:{s:20:\"dynamic_element_type\";s:10:\"port_media\";s:21:\"port_media_image_comb\";a:3:{s:5:\"image\";s:0:\"\";s:3:\"alt\";s:0:\"\";s:5:\"title\";s:0:\"\";}s:21:\"port_media_video_comb\";s:26:\"http:\/\/vimeo.com\/112591203\";}}s:15:\"page_title_show\";s:3:\"yes\";s:10:\"page_title\";s:0:\"\";s:13:\"page_subtitle\";s:0:\"\";s:20:\"zn_disable_subheader\";s:2:\"no\";}" 作为一个字符串。

我怎样才能只抓住分号的 http://... 部分并将其转换为对 url 友好的 .. url?

【问题讨论】:

  • 这不是 JSON。它是一种不同形式的序列化(也许是 PHP?)。你需要找到合适的反序列化器并反序列化成一个数据结构,你可以从中读取你想要的数据。
  • 你为什么不直接反序列化这个字符串,这样你就可以简单地访问你需要的属性:custom_fields = JSON.parse(custom_fields);这就是 JSON 的重点:无需处理字符串,这是一个对象!!

标签: jquery arrays json vimeo custom-fields


【解决方案1】:

您需要的只是从一个很长的字符串中获取一个 url,这样您就可以使用正则表达式来实现这一点。代码如下:

var s = "a:8:{s:7:\"sp_link\";a:2:{s:3:\"url\";s:0:\"\";s:6:\"target\";s:6:\"_blank\";}s:6:\"sp_col\";s:0:\"\";s:14:\"sp_show_social\";s:3:\"yes\";s:10:\"port_media\";a:1:{i:0;a:3:{s:20:\"dynamic_element_type\";s:10:\"port_media\";s:21:\"port_media_image_comb\";a:3:{s:5:\"image\";s:0:\"\";s:3:\"alt\";s:0:\"\";s:5:\"title\";s:0:\"\";}s:21:\"port_media_video_comb\";s:26:\"http:\/\/vimeo.com\/112591203\";}}s:15:\"page_title_show\";s:3:\"yes\";s:10:\"page_title\";s:0:\"\";s:13:\"page_subtitle\";s:0:\"\";s:20:\"zn_disable_subheader\";s:2:\"no\";}";
var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi;
var regex = new RegExp(expression);
var url = s.match(regex)[0]; //"http://vimeo.com/112591203"

JSFiddle

您可以参考这篇 stackoverflow 文章,了解使用什么正则表达式来查找 url。 What is a good regular expression to match a URL?

【讨论】:

  • OP 应该专注于反序列化而不是正则表达式操作。
  • 迈克,"a:8:{s:7:\"sp_link\";a:2:{s:3:\"url\";s:0:\"\"; s:6:\"目标\";s:6:\"_blank\";}s:6:\"sp_col\";s:0:\"\";s:14:\"sp_show_social\"; s:3:\"是\";s:10:\"port_media\";a:1:{i:0;a:3:{s:20:\"dynamic_element_type\";s:10:\" port_media\";s:21:\"port_media_image_comb\";a:3:{s:5:\"image\";s:0:\"\";s:3:\"alt\";s: 0:\"\";s:5:\"title\";s:0:\"\";}s:21:\"port_media_video_comb\";s:26:\"http:\/\/vimeo .com\/112591203\";}}s:15:\"page_title_show\";s:3:\"yes\";s:10:\"page_title\";s:0:\"\";s :13:\"page_subtitle\";s:0:\"\";s:20:\"zn_disable_subheader\";s:2:\"no\";}" 不是json字符串,所以你怎么能反序列化是吗?
  • 这似乎是一个 PHP 序列化,因此需要使用 PHP 对其进行反序列化,使用 PHP 反序列化的 javascript 实现进行反序列化,例如 phpjs.org/functions/unserialize,或者修复 API 本身以实际返回 JSON (如果这在他的控制之下)。
  • 我正在为 wordpress 使用 JSON API 插件来返回此信息。我将研究反序列化。以前从来没有处理过这个问题,所以谢谢你:) regexp 的东西也让我很困惑,但是上面的代码到目前为止似乎可以工作,所以谢谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多