gpt4 book ai didi

Emacs 中的 JSON 请求,第 2 阶段 : Getting a collection of items

转载 作者:行者123 更新时间:2023-12-04 18:36:16 24 4
gpt4 key购买 nike

我正在尝试使用 request.el 使用 Stack Exchange API 获取站点列表(a 列表列表) .

我在做 an Emacs major mode for Stack Exchange ,所以这对你的 Emacs 用户来说有一些不错的潜在返回。 ;) (因为我标记了 elisp,所以我假设你们很多人都这样。)

要做到这一点,一个基本的必要条件是请求 JSON,然后查看返回的站点列表。 StackExchange API 提供了 /sites资源,对该资源的请求返回 site 的集合像这样的对象:

{
"items": [
{
"site_type": "main_site",
"name": "Stack Overflow",
"logo_url": "http://cdn.sstatic.net/stackoverflow/img/logo.png",
"api_site_parameter": "stackoverflow",
"site_url": "http://stackoverflow.com",
"audience": "professional and enthusiast programmers",
"icon_url": "http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png",
"aliases": [
"http://www.stackoverflow.com"
],
"site_state": "normal",
"styling": {
"link_color": "#0077CC",
"tag_foreground_color": "#3E6D8E",
"tag_background_color": "#E0EAF1"
},
"launch_date": 1221436800,
"favicon_url": "http://cdn.sstatic.net/stackoverflow/img/favicon.ico",
"related_sites": [
{
"name": "Stack Overflow Chat",
"site_url": "http://chat.stackoverflow.com",
"relation": "chat"
}
],
"markdown_extensions": [
"Prettify"
],
"high_resolution_icon_url": "http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon@2.png"
},
{
"site_type": "main_site",
"name": "Server Fault",
"logo_url": "http://cdn.sstatic.net/serverfault/img/logo.png",
"api_site_parameter": "serverfault",
"site_url": "http://serverfault.com",
"audience": "professional system and network administrators",
"icon_url": "http://cdn.sstatic.net/serverfault/img/apple-touch-icon.png",
...
},
{
"site_type": "main_site",
"name": "Super User",
...
{
"site_type": "main_site",
"name": "Meta Stack Overflow",
...
}
...
}

我想尽量减少我对 API 的调用次数,并检索它们并将它们一次性放入一个数据结构中,以便我以后能够理解它。

我正在尝试调整我在这里找到的一个可爱的解决方案, Making JSON requests within Emacs ,以适应我需要做的事情。它使用 request.el图书馆,来自 tkf。

tkf 给我的示例能够回答网站上最活跃的问题并获取其 titletags使用 json-read 的属性,它本质上将一个对象变成了一个列表。此尝试基于该解决方案:
(request
"https://api.stackexchange.com/2.1/sites"
:parser 'buffer-string
:success (function*
(lambda (&key data &allow-other-keys)
(let* ((items (assoc-default 'items data))
(names (mapcar (lambda (item) (assoc-default 'name item)) items))
(launches (mapcar (lambda (item) (assoc-default 'launch-date item)) items)))
(mapcar* (lambda (name launch)
(message "name:`%s` launch:`%s`" name launch))
names
launches)))))

...但似乎完全无效。其他示例工作正常,所以我的用法有问题。

request.el 可以从 MELPA 包存储库下载,据我所知,需要 curl正确运行(我有)。

我怀疑问题出在我对 mapcar* 的使用(或准备)上,其中以下确实按预期工作:
(mapcar* (lambda (a b) (insert a) (insert b)) '(1 2 3) '(4 5 6))

我知道这篇文章很长,但我尽量提供尽可能多的信息。

最佳答案

你快到了。这个对我有用:

(request
"https://api.stackexchange.com/2.1/sites"
:parser 'json-read
:success (function*
(lambda (&key data &allow-other-keys)
(let* ((items (assoc-default 'items data))
(names (mapcar (lambda (item) (assoc-default 'name item)) items))
(launches (mapcar (lambda (item) (assoc-default 'launch_date item)) items)))
(mapcar* (lambda (name launch)
(message "name:`%s` launch:`%s`" name launch))
names
launches)))))

两个变化:1.使用 json-read而不是 buffer-string对于解析器参数。 2.使用 launch_date而不是 launch-date作为 alist 的 key 。

关于Emacs 中的 JSON 请求,第 2 阶段 : Getting a collection of items,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com