javascript - 使用 Javascript 创建带有 JSON 信息的网站链接?

标签 javascript html json parsing amazon-s3

我目前有一个托管在 AWS 上的网站。我的静态页面位于公共(public) S3 存储桶中,同一存储桶中有一个 JSON 文件,其中包含我想要在网页上显示的文件的名称和 URL。下面是 JSON 的示例:

{
  "bass": [{
      "bass-song1": "http://www.website.com/bass-song1.pdf"
    }, {
      "bass-song2": "http://www.website.com/bass-song2.pdf"
    }],
  "drum": [{
      "drum-song1": "http://www.website.com/drum-song1.pdf"
    }, {
      "drum-song2": "http://www.website.com/drum-song2.pdf"
    }],
  "guitar": [{
      "guitar-song1": "http://www.website.com/guitar-song1.pdf"
    }, {
      "guitar-song2": "http://www.website.com/guitar-song2.pdf"
    }]
}

如您所见,乐器(贝斯、鼓、吉他)是键,其关联值是一个包含几首歌曲的列表,格式如下:{"song title": "URL of the file"}.

我的目标:我想编写一个 JavaScript 来解析此 JSON 文件,使用这些 PDF 文件的名称(例如“bass-song1”)作为链接标题及其关联的 URL(例如 http://www.website.com/bass-song1.pdf)创建指向这些 PDF 文件的链接)。 这是我到目前为止所拥有的内容(位于我的 HTML 页面的正文中):

<script type="text/javascript">

async function getData(url) {
  const response = await fetch(url);
  return response.json()
}

async function main() {
  const data = await getData(<URL OF THE JSON IN MY S3 BUCKET>);

  // 'instrument' example: 'bass'
  for (var instrument in data) {
    // store the list of bass songs
    var song_list = data[instrument]

    // for each song (list element),
    for (var song in song_list) {
      // store the song's object in 'song_object' (python dict = js object)
      var song_object = song_list[song]
      // create a link with the name and URL of the PDF song file
      var link_str = song_object.constructor.name;
      var link_url = song_object[link_str];

      // TO DO: CREATE LINK TO APPEAR ON WEBSITE

    }
  }
}
// Run main; didn't work without doing this
main();

</script>

我将非常感谢任何指示或建议。我正在尝试通过这个项目学习 javascript,今天我一定花了 7-8 个小时试图解决这个问题(以及相关的任务)。我了解 Python 和 HTML,但我对 Javascript 还很陌生。

谢谢你, 塞巴斯蒂安

最佳答案

Object.constructor.name 打印对象构造函数的名称 - 您的 for x in data 调用将迭代该对象的键,这些键都是字符串 -基本上,Object.constructor.name 会打印“String”,而您实际上只需要迭代器值本身。

下面是代码的修订版本,它使用 document.createElementdocument.body.append 创建新的 DOM 元素并将其分别添加到页面。别担心,如果你想要的话,你可以内联它,伙计。内嵌你的心。

您可以在任何 DOMNode 上使用 append,即 document.getElementById("myContainer").append(myNewLink)

async function getData(url) {
  const response = await fetch(url);
  return response.json()
}

var testOb = {
  "bass": [{
      "bass-song1": "http://www.website.com/bass-song1.pdf"
    }, {
      "bass-song2": "http://www.website.com/bass-song2.pdf"
    }],
  "drum": [{
      "drum-song1": "http://www.website.com/drum-song1.pdf"
    }, {
      "drum-song2": "http://www.website.com/drum-song2.pdf"
    }],
  "guitar": [{
      "guitar-song1": "http://www.website.com/guitar-song1.pdf"
    }, {
      "guitar-song2": "http://www.website.com/guitar-song2.pdf"
    }]
};


async function main(data) {
  // this will contain your data object
  // const data = await getData(<URL OF THE JSON IN MY S3 BUCKET>);

  for (var instrument in data) {
    // 'instrument' example: 'bass'

    // song list
    var songs = data[instrument];
    songs.forEach(function(song){

      // 'song' example: {guitar-song1: "http://www.website.com/guitar-song1.pdf"}
      for (var songName in song) {
        var songUrl = song[songName];
        
        // create element in DOM
        var a = document.createElement("a");
        var lineBreak = document.createElement("br");
        
        a.setAttribute("href", songUrl);
        a.innerHTML = songName;

        // append to body
        document.body.append(a);
        document.body.append(lineBreak);

      }
    });

  }
}

main(testOb);
<html>
<body>
</body>
</html>

关于javascript - 使用 Javascript 创建带有 JSON 信息的网站链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60219970/

相关文章:

javascript - 在 for 循环中创建时,只有最后一个径向进度条有效

javascript - 当对象是子类的实例时,如何获取对象的类名?

javascript - onkeyup 字符在字符串中的位置

json - 如何根据属性名称更新 JSONB 数组?

javascript - 一支球队的所有进球数(来自 JSON)

python - 使用 Python 解析 JSON 文件 -> google map api

javascript - 仅显示 div(预加载器)一次 - 直到清除缓存/ session

javascript - 在 slider 更改时将类添加到标题

php - 如何使用 mPDF 将 php 文件的输出转换为变量

javascript - Bootstrap3文件输入