Emacs中的JSON请求,第2阶段:获取项目集合
我正在尝试使用堆栈交换API获取站点列表(a列表列表) 我正在赚钱,所以这对你们这些Emacs用户来说有一些不错的潜在回报(既然我给elisp加了标签,我想你们都是。) 要做到这一点,最基本的需要是请求JSON,然后查看返回站点的列表。StackExchange API提供资源,对该资源的请求将返回如下对象的集合:Emacs中的JSON请求,第2阶段:获取项目集合,json,request,elisp,Json,Request,Elisp,我正在尝试使用堆栈交换API获取站点列表(a列表列表) 我正在赚钱,所以这对你们这些Emacs用户来说有一些不错的潜在回报(既然我给elisp加了标签,我想你们都是。) 要做到这一点,最基本的需要是请求JSON,然后查看返回站点的列表。StackExchange API提供资源,对该资源的请求将返回如下对象的集合: { "items": [ { "site_type": "main_site", "name": "Stack Overflow",
{
"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的调用次数,并一次性检索它们并将它们放入数据结构中,以便以后能够理解它
我正在尝试调整我在这里找到的一个可爱的解决方案,以适合我需要做的事情。它使用来自tkf的库
tkf给我的例子是,使用json read
,能够在站点上获取最活跃的问题,并获取其标题
和标签
属性,这实际上将一个对象转化为a列表。此尝试基于该解决方案:
(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)))))
……但似乎完全无效。其他的例子工作得很好,所以我的用法有问题
可以从MELPA软件包存储库下载request.el,据我所知,它需要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\u date
而不是launch date
作为alist的键。哦,天哪,我忘了我更改了解析器函数。再次感谢,@tkf!不过有一个小问题:每次执行请求时,都会出现一条消息:“[cl-struct-request-response-nil-nil-nil”https://api.stackexchange.com/2.1/sites“nil(:parser json read:success(lambda(&rest--cl rest--)”(fn&键数据&允许其他键)”(let*…):错误(closure(t)(&rest参数)(应用……参数)):url“https://api.stackexchange.com/2.1/sites“:response#0)#nil nil…]
“--我是做错了什么,还是这很正常?如果使用C-x C-e
或C-M-x
计算表达式,这很正常。Emacs只是打印返回值。