首页 > 解决方案 > 将 Json 中的特定属性刮到新的 Json 中

问题描述

我有一个 wordpress 网站,我有一个 API 将帖子导出为 Json。我用这个消息建立了一个新网站,但是我必须使用这个 Json 文件,并以某种方式将其格式化为一个带有我的属性名称的新 Json 文件。我也想从中丢弃一些属性。因此,这是我从帖子中获得的 Json 的一个简单示例:

{
  "status": "ok",
  "post": {
    "id": 2335,
    "type": "post",
    "slug": "litoral-awards14-no-jornal-diario-porto-canal",
    "url": "https:\/\/litoralmagazine.com\/litoral-awards14-no-jornal-diario-porto-canal\/",
    "status": "publish",
    "title": "Litoral Awards’14 no Jornal Di\u00e1rio do Porto Canal",
    "title_plain": "Litoral Awards’14 no Jornal Di\u00e1rio do Porto Canal",
    "content": "<div id=\"tps_slideContainer_2335\" class=\"theiaPostSlider_slides\"><div>\n\n\n\n<\/div><\/div><div class=\"theiaPostSlider_footer _footer\"><\/div><p><!-- END THEIA POST SLIDER --><\/p>\n\n                <script type='text\/javascript'>\n                    \n                var tpsInstance;\n                var tpsOptions = {\"slideContainer\":\"#tps_slideContainer_2335\",\"nav\":[\".theiaPostSlider_nav\"],\"navText\":\"%{currentSlide} de %{totalSlides}\",\"helperText\":\"\",\"defaultSlide\":0,\"transitionEffect\":\"slide\",\"transitionSpeed\":400,\"keyboardShortcuts\":true,\"scrollAfterRefresh\":true,\"numberOfSlides\":1,\"slides\":[],\"useSlideSources\":true,\"themeType\":\"font\",\"prevText\":\"Anterior\",\"nextText\":\"Seguinte\",\"buttonWidth\":\"0\",\"buttonWidth_post\":\"0\",\"postUrl\":\"https:\\\/\\\/litoralmagazine.com\\\/litoral-awards14-no-jornal-diario-porto-canal\\\/\",\"postId\":2335,\"refreshAds\":false,\"refreshAdsEveryNSlides\":\"1\",\"adRefreshingMechanism\":\"javascript\",\"siteUrl\":\"https:\\\/\\\/litoralmagazine.com\",\"loopSlides\":false,\"scrollTopOffset\":\"0\",\"prevFontIcon\":\"<span aria-hidden=\\\"true\\\" class=\\\"tps-icon-chevron-circle-left\\\"><\\\/span>\",\"nextFontIcon\":\"<span aria-hidden=\\\"true\\\" class=\\\"tps-icon-chevron-circle-right\\\"><\\\/span>\"};\n            \n                    (function ($) {\n                        $(document).ready(function () {\n                            \n                            tpsInstance = new tps.createSlideshow(tpsOptions);\n                        });\n                    }(jQuery));\n                <\/script>\n            ",
    "excerpt": "",
    "date": "2014-12-13 12:02:05",
    "modified": "2016-05-18 09:31:00",
    "categories": [
      {
        "id": 299,
        "slug": "litoral-awards",
        "title": "Litoral Awards",
        "description": "",
        "parent": 0,
        "post_count": 91
      },
      {
        "id": 342,
        "slug": "clipping-2014",
        "title": "clipping-2014",
        "description": "",
        "parent": 0,
        "post_count": 3
      },
      {
        "id": 573,
        "slug": "litoral-awards-2014",
        "title": "Litoral Awards 2014",
        "description": "",
        "parent": 0,
        "post_count": 21
      }
    ],
    "tags": [
      {
        "id": 82,
        "slug": "featured2",
        "title": "Featured2",
        "description": "",
        "post_count": 10
      },
      {
        "id": 312,
        "slug": "litoral-awards-2015",
        "title": "litoral awards 2015",
        "description": "",
        "post_count": 19
      }
    ],
    "author": {
      "id": 4,
      "slug": "litoral-magazine",
      "name": "Litoral Magazine",
      "first_name": "Litoral",
      "last_name": "Magazine",
      "nickname": "Litoral Magazine",
      "url": "https:\/\/litoralmagazine.com",
      "description": ""
    },
    "comments": [],
    "attachments": [
      {
        "id": 2336,
        "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014.jpg",
        "slug": "porto-canal-jornal-diario-litoral-awards-2014",
        "title": "porto-canal-jornal-diario-litoral-awards-2014",
        "description": "",
        "caption": "",
        "parent": 2335,
        "mime_type": "image\/jpeg",
        "images": {
          "full": {
            "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014.jpg",
            "width": 1000,
            "height": 600
          },
          "thumbnail": {
            "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014-150x150.jpg",
            "width": 150,
            "height": 150
          },
          "medium": {
            "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014-300x180.jpg",
            "width": 300,
            "height": 180
          },
          "medium_large": {
            "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014.jpg",
            "width": 1000,
            "height": 600
          },
          "post-thumbnail": {
            "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014.jpg",
            "width": 1000,
            "height": 600
          },
          "post-thumb": {
            "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014.jpg",
            "width": 1000,
            "height": 600
          },
          "medium-thumb": {
            "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014-400x240.jpg",
            "width": 400,
            "height": 240
          },
          "small-thumb": {
            "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014-95x60.jpg",
            "width": 95,
            "height": 60
          }
        }
      }
    ],
    "comment_count": 0,
    "comment_status": "closed",
    "thumbnail": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014.jpg",
    "custom_fields": {
      "tps_options": [
        "a:1:{s:7:\"enabled\";s:6:\"global\";}",
        "a:1:{s:7:\"enabled\";s:6:\"global\";}",
        "a:1:{s:7:\"enabled\";s:6:\"global\";}"
      ],
      "mvp_photo_credit": [
        "Nulla pariatur excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia. Photo by Shutterstock."
      ],
      "mvp_post_template": [
        "def-wide"
      ],
      "mvp_featured_image": [
        "show"
      ],
      "post_views_count": [
        "998"
      ],
      "mvp_video_embed": [
        "<iframe width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/BG5RVursEGQ?list=PLtUECMbIwb1X1NJEIU9pAbWkzBWMmg6Hj\" frameborder=\"0\" allowfullscreen><\/iframe>"
      ],
      "dpsp_networks_shares": [
        "a:0:{}"
      ]
    },
    "thumbnail_size": "post-thumbnail",
    "thumbnail_images": {
      "full": {
        "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014.jpg",
        "width": 1000,
        "height": 600
      },
      "thumbnail": {
        "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014-150x150.jpg",
        "width": 150,
        "height": 150
      },
      "medium": {
        "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014-300x180.jpg",
        "width": 300,
        "height": 180
      },
      "medium_large": {
        "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014.jpg",
        "width": 1000,
        "height": 600
      },
      "post-thumbnail": {
        "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014.jpg",
        "width": 1000,
        "height": 600
      },
      "post-thumb": {
        "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014.jpg",
        "width": 1000,
        "height": 600
      },
      "medium-thumb": {
        "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014-400x240.jpg",
        "width": 400,
        "height": 240
      },
      "small-thumb": {
        "url": "https:\/\/litoralmagazine.com\/wp-content\/uploads\/2016\/01\/porto-canal-jornal-diario-litoral-awards-2014-95x60.jpg",
        "width": 95,
        "height": 60
      }
    }
  },
  "previous_url": "https:\/\/litoralmagazine.com\/litoral-awards14-no-canal-central\/",
  "next_url": "https:\/\/litoralmagazine.com\/premio-musica-sons-em-transito\/"
}

我怎样才能制作一个脚本,例如以这种格式输出这个 json:

{
  "status": "ok",
  "slug": "litoral-com-teste-noticia-url",
  "title": "Titulo de teste",
  "type": "post",
  "content": "Lorem",
  "published": 1,
  "excerpt": "",
  "categories": [1, 2, 4],
  "tags": [1, 2, 4],
  "author": 1,
  "comments": {
    "user_comment": 1,
    "body_comment": "comentario de teste"
  },
  "images": {
    "thumbnail_image": "http://wwww.imagem.com.jpeg",
    "featured_image": "http://wwww.imagem.com.jpeg"
  }
}

例如,我想说:originalJson.status = newJson.status。originalJson.author.id = newJson.author。originalJson.thumbnail.url = newJson.images.thumbnail_image。我希望你明白我的意思。您还可以在我得到的 json 上看到,在 originalJson.post.content 上我有很多 html,如下所示:

<div id=\"tps_nav_upper_1785\" class=\"theiaPostSlider_nav _right fontTheme _upper\"><div class=\"_buttons\"><span class=\"_button _prev _another_post _disabled\"><span class=\"_1\"></span><span class=\"_2\" ><span aria-hidden=\"true\" class=\"tps-icon-chevron-circle-left\"></span></span><span class=\"_3\">Anterior</span></span><span class=\"_text\">1 de 15</span><a href=\"https://litoralmagazine.com/testemunhos-litoral-awards/2/\" class=\"_button _next\"><span class=\"_1\">Seguinte</span><span class=\"_2\" ><span aria-hidden=\"true\" class=\"tps-icon-chevron-circle-right\"></span></span><span class=\"_3\"></span></a></div><div class=\"_title\"><span class=\"_helper\"></span></div></div><div id=\"tps_slideContainer_1785\" class=\"theiaPostSlider_slides\"><div>\n\n<div id=\"attachment_1958\" style=\"width: 210px\" class=\"wp-caption alignleft\"><img class=\"wp-image-1958 size-medium\" src=\"https://litoralmagazine.com/wp-content/uploads/2014/11/ribau-esteves-200x300.jpg\" alt=\"ribau-esteves\" width=\"200\" height=\"300\" srcset=\"https://litoralmagazine.com/wp-content/uploads/2014/11/ribau-esteves-200x300.jpg 200w, https://litoralmagazine.com/wp-content/uploads/2014/11/ribau-esteves-600x900.jpg 600w, https://litoralmagazine.com/wp-content/uploads/2014/11/ribau-esteves.jpg 601w\" sizes=\"(max-width: 200px) 100vw, 200px\" /><p class=\"wp-caption-text\">Ribau Esteves &#8211; Presidente da Câmara Municipal de Aveiro</p></div>\n<p style=\"text-align: left;\">A edição de 2015 da Gala Litoral Awards marcou a agenda do município e da região de Aveiro, num exercício elegante e justo que reconhece e motiva todos para fazermos mais e melhor pela vida, pelas empresas, pelos municípios, pela região e pelas pessoas. Fazer muito e bem tem de ser, cada vez mais, uma tarefa importante e permanente. Reconhecer e premiar o mérito são atos nobres e necessários, para que juntos possamos continuar a crescer.</p>\n<h6 style=\"text-align: left;\">\n\n</div></div><div id=\"tps_nav_lower_1785\" class=\"theiaPostSlider_nav _right fontTheme _lower\"><div class=\"_buttons\"><span class=\"_button _prev _another_post _disabled\"><span class=\"_1\"></span><span class=\"_2\" ><span aria-hidden=\"true\" class=\"tps-icon-chevron-circle-left\"></span></span><span class=\"_3\">Anterior</span></span><span class=\"_text\">1 de 15</span><a href=\"https://litoralmagazine.com/testemunhos-litoral-awards/2/\" class=\"_button _next\"><span class=\"_1\">Seguinte</span><span class=\"_2\" ><span aria-hidden=\"true\" class=\"tps-icon-chevron-circle-right\"></span></span><span class=\"_3\"></span></a></div><div class=\"_title\"><span class=\"_helper\"></span></div></div><div class=\"theiaPostSlider_footer _footer\"></div><p><!-- END THEIA POST SLIDER --></p>\n\n                <script type='text/javascript'>\n                    \n                var tpsInstance;\n                var tpsOptions = {\"slideContainer\":\"#tps_slideContainer_1785\",\"nav\":[\".theiaPostSlider_nav\"],\"navText\":\"%{currentSlide} de %{totalSlides}\",\"helperText\":\"\",\"defaultSlide\":0,\"transitionEffect\":\"slide\",\"transitionSpeed\":400,\"keyboardShortcuts\":true,\"scrollAfterRefresh\":true,\"numberOfSlides\":15,\"slides\":[],\"useSlideSources\":true,\"themeType\":\"font\",\"prevText\":\"Anterior\",\"nextText\":\"Seguinte\",\"buttonWidth\":\"0\",\"buttonWidth_post\":\"0\",\"postUrl\":\"https:\\/\\/litoralmagazine.com\\/testemunhos-litoral-awards\\/\",\"postId\":1785,\"refreshAds\":false,\"refreshAdsEveryNSlides\":\"1\",\"adRefreshingMechanism\":\"javascript\",\"siteUrl\":\"https:\\/\\/litoralmagazine.com\",\"loopSlides\":false,\"scrollTopOffset\":\"0\",\"prevFontIcon\":\"<span aria-hidden=\\\"true\\\" class=\\\"tps-icon-chevron-circle-left\\\"><\\/span>\",\"nextFontIcon\":\"<span aria-hidden=\\\"true\\\" class=\\\"tps-icon-chevron-circle-right\\\"><\\/span>\"};\n            \n                    (function ($) {\n                        $(document).ready(function () {\n                            \n                            tpsInstance = new tps.createSlideshow(tpsOptions);\n                        });\n                    }(jQuery));\n                </script>\n 

当将此信息传递给新的json时,最好的方法是什么,剪切所有的div?我只想要div里面的东西。我怎样才能做到这一点?

我试图搜索这个,但我找不到它。基本上我怎样才能像 JS 脚本一样,将旧的 Json 文件作为输入,并输出一个新的 json 文件,但只有我想要的属性,并且像我解释的那样重命名大多数属性。

感谢您的帮助!

标签: javascriptjsonscrape

解决方案


对于您的第一个问题,假设您不想动态指定所需的字段,您可以通过执行以下操作使其看起来更干净:

newJson = { 
    status: oldJson.status,
    author: oldJson.author
}

对于你的第二个问题:我能想到的最接近的方法是如何删除divs 你可以:

  • 使用replace方法替换<divand></div为空字符串
  • 遍历字符串,找到 first-next的索引 <div和first-next 的索引>,以及substring中间的字符串。

html但是,如果我处于您的位置,我会首先尝试找到除字符串操作之外的其他获取数据的方法。


推荐阅读