【问题标题】:How to extract all Urls from Json object如何从 Json 对象中提取所有 URL
【发布时间】:2021-09-24 13:35:46
【问题描述】:

无论 JSON 对象结构如何(简单或复杂),将所有 url 从以下对象提取到数组中以在 Javascript 中迭代的理想方法是什么?

    {
    "url": "https://example.com:443/-/media/images/site/info",
    "data": [
        {
            "id": "da56fac6-6907-4055-96b8-f8427d4c64fd",
            "title": "AAAA 2021",
            "time": "",
            "dateStart": "2021-03-01T08:00:00Z",
            "dateEnd": "2021-12-31T15:00:00Z",
            "address": "",
            "geo": {
                "longitude": "",
                "latitude": "",
                "mapExternalLink": ""
            },
            "price": "Free Admission",
            "masonryImage": "https://example.com:443/-/media/images/site/siteimages/tcsm2021/fullwidthbanner/tcsmfullwidthicecream.ashx",
            "image": "https://example.com:443/-/media/images/site/siteimages/tcsm2021/fullwidthbanner/tcsmfullwidthicecream.ashx",
            "showDateInfo": false,
            "showDateInfoOnListings": false,
            "showTimeInfo": false,
            "showTimeInfoOnListings": false,
            "tags": [
                {
                    "key": "Lifestyle",
                    "name": "Lifestyle"
                }
            ],
            
            "partnerName": "",
            "sort_data": {
                "recommended": 0,
                "recent": 3,
                "partner": 0,
                "popular": 0
            }
        }
    ]
}

我想得到一个数组中的结果,例如:

[
https://example.com:443/-/media/images/site/info,https://example.com:443/-/media/images/site/siteimages/tcsm2021/fullwidthbanner/tcsmfullwidthicecream.ashx,    https://example.com:443/-/media/images/site/siteimages/tcsm2021/fullwidthbanner/tcsmfullwidthicecream.ashx
]

我知道我需要应用一些正则表达式来提取 url,但不确定如何将 json 对象视为字符串以进行正则表达式处理?

【问题讨论】:

  • 一种方法是递归遍历 JSON 并将每个值与 URL 正则表达式模式匹配。
  • 创建一个可以处理任何 json 结构(简单、复杂或深度嵌套)的递归方法听起来很复杂?
  • JSON 解析是一个已解决的问题。人们已经编写、测试和调试了处理这个问题的代码。这是我广泛使用的一个:github.com/blackflux/object-scan,或者使用 xPath 语法goessner.net/articles/JsonPath

标签: javascript json regex


【解决方案1】:

我同意使用 JSON 解析器,但如果你想用正则表达式来做,你可以试试这个

console.log(JSON.stringify({
  "url": "https://example.com:443/-/media/images/site/info",
  "data": [{
    "id": "da56fac6-6907-4055-96b8-f8427d4c64fd",
    "title": "AAAA 2021",
    "time": "",
    "dateStart": "2021-03-01T08:00:00Z",
    "dateEnd": "2021-12-31T15:00:00Z",
    "address": "",
    "geo": {
      "longitude": "",
      "latitude": "",
      "mapExternalLink": ""
    },
    "price": "Free Admission",
    "masonryImage": "https://example.com:443/-/media/images/site/siteimages/tcsm2021/fullwidthbanner/tcsmfullwidthicecream.ashx",
    "image": "https://example.com:443/-/media/images/site/siteimages/tcsm2021/fullwidthbanner/tcsmfullwidthicecream.ashx",
    "showDateInfo": false,
    "showDateInfoOnListings": false,
    "showTimeInfo": false,
    "showTimeInfoOnListings": false,
    "tags": [{
      "key": "Lifestyle",
      "name": "Lifestyle"
    }],

    "partnerName": "",
    "sort_data": {
      "recommended": 0,
      "recent": 3,
      "partner": 0,
      "popular": 0
    }
  }]
}).match(/(?<=")https?:\/\/[^\"]+/g));

(?&lt;=")https?:\/\/[^\"]+ 基本上会找到以协议方案开头的模式(http:// 或 https:// 前面有一个 " 字符),后跟任何 "

【讨论】:

    【解决方案2】:

    我认为更好更简单的方法是将给定的 json 字符串化为字符串并通过正则表达式解决它。 但是,如果您需要通过递归来解决它,请尝试以下代码:

    const obj = {
        url: "https://example.com:443/-/media/images/site/info",
        data: [
          {
            id: "da56fac6-6907-4055-96b8-f8427d4c64fd",
            title: "AAAA 2021",
            time: "",
            dateStart: "2021-03-01T08:00:00Z",
            dateEnd: "2021-12-31T15:00:00Z",
            address: "",
            geo: {
              longitude: "",
              latitude: "",
              mapExternalLink: "",
            },
            price: "Free Admission",
            masonryImage:
              "https://example.com:443/-/media/images/site/siteimages/tcsm2021/fullwidthbanner/tcsmfullwidthicecream.ashx",
            image: "https://tw.yahoo.com",
            showDateInfo: false,
            showDateInfoOnListings: false,
            showTimeInfo: false,
            showTimeInfoOnListings: false,
            tags: [
              {
                key: "Lifestyle",
                name: "Lifestyle",
                link: "https://www.google.com",
              },
            ],
    
            partnerName: "",
            sort_data: {
              recommended: 0,
              recent: 3,
              partner: 0,
              popular: 0,
              anotherObj: {
                link: "https://www.github.com",
              },
            },
          },
        ],
      };
      function getUrl(obj) {
        const ary = [];
        helper(obj, ary);
        return ary;
      }
    
      function helper(item, ary) {
        if (typeof item === "string" && isUrl(item)) {
          ary.push(item);
          return;
        } else if (typeof item === "object") {
          for (const k in item) {
            helper(item[k], ary);
          }
          return;
        }
    
        return null;
      }
    
      function isUrl(str) {
        if (typeof str !== "string") return false;
        return /http|https/.test(str);
      }
    
      console.log(getUrl(obj));
    

    但是如果你使用这个解决方案,你需要将你的 json 转换成 js 对象

    【讨论】:

      猜你喜欢
      • 2017-04-12
      • 2021-06-18
      • 2016-04-25
      • 2016-12-28
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      相关资源
      最近更新 更多