[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: small seq function for json data
From: |
Helmut Eller |
Subject: |
Re: small seq function for json data |
Date: |
Sun, 16 Oct 2016 09:25:23 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) |
On Sun, Oct 16 2016, Stefan Huchler wrote:
> accessing data coming from json requests can be a little bit anoying
> in elisp I think.
Yes, sounds familiar.
> So inspired by let-alist I wrote a more powerful version that supports
> also vector which is also used in json messages.
>
> (setq x '((foo . [((bar . "string of interest"))])))
>
> (defun sbit-seq-get (seq path)
> (cond ((null path) seq)
> ((listp seq)
> (sbit-seq-get (cdr (assoc (car path) seq)) (cdr path))
> )
> ((vectorp seq)
> (sbit-seq-get (elt seq (car path)) (cdr path))
> )
> (t seq)))
>
> (sbit-seq-get x '(foo 0 bar))
I've used this:
(defun json--ref (json key)
(cl-etypecase key
(symbol (let ((probe (assq key json)))
(cond (probe (cdr probe))
(t (error "No entry for key: %S %S" key json)))))
(integer (aref json key))))
(defun json-ref (json key &rest keys)
(let ((tmp (json--ref json key)))
(while keys
(setq tmp (json--ref tmp (pop keys))))
tmp))
(json-ref x 'foo 0 'bar)
A difference is that json--ref signals an error if the key is not in
present.
> Does that make sense? Maybe integrate something similar to seq.el?
I think json.el would be the natural place; json objects are more like
trees than sequences.
Helmut