guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: help with guile-json inconsistencies


From: Aleix Conchillo Flaqué
Subject: Re: help with guile-json inconsistencies
Date: Sun, 9 Dec 2018 23:27:34 -0800

On Sun, Dec 9, 2018 at 10:33 PM Aleix Conchillo Flaqué
<address@hidden> wrote:
>
> On Sun, Dec 9, 2018 at 2:56 AM Aleix Conchillo Flaqué
> <address@hidden> wrote:
> >
> > Hi guilers,
> >
> > a new guile-json issue came to me recently:
> >
> > https://github.com/aconchillo/guile-json/issues/22
> >
> > I don't really have a solution yet on how to solve this, so I would
> > love some advice. The issue is that one can do:
> >
> >   (scm->json '(1 2 3)) which returns [1,2,3]
> >
> > however, if you do:
> >
> >   (scm->json '((1 2 3)) it returns {"1":[2,3]} but one would probably
> > expect [[1,2,3]]
> >   (scm->json '((1 2 3) (4 5 6)) it returns {"1":[2,3], "4":[5,6]} but
> > one would probably expect [[1,2,3], [4,5,6]]
> >
> > I guess the first question is, does everyone else feel the same way
> > about the return value?
> >
> > The problem is that there's a function that checks if something is an
> > alist by basically checking if it's a pair? recursively and if so, it
> > builds a json object.
> >
>
> Just to clarify, the problem is not when parsing JSON to scheme data
> types, this is fine as internally guile-json uses hash tables and
> lists properly.
>
> The problem is with going from scheme to json. For convenience,
> guile-json doesn't expect a hash table from the user, instead it tries
> to guess what's a list and what's an alist however, that seems not
> really distinguishable. That is, there's no way to tell if '((1 2)) is
> [[1, 2]] or {"1" : [2]} or  {"1" : "2"}.
>
> I guess going back to a macro approach for these type of cases would
> help (even though I had the same problem with my initial macro).
>

Answering myself again. Re-adding the macro fixes the issue, but with
a breaking change.

(scm->json '(1 2 3))
      -> [1,2,3]

(scm->json '((1 2 3) (4 5 6)))
      -> [[1,2,3],[4,5,6]]

(scm->json (json (object ("key1" "value1") ("key2" (1 2 3)))))
      -> {"key2":[1,2,3],"key1":"value1"}

(scm->json `((1 2 3) ,(json (object (4 5)))))
      -> [[1,2,3],{"4":5}]

So, the (json) macro is only needed to specify JSON objects, otherwise
you can use scheme types directly (and lists are always arrays).

Aleix



reply via email to

[Prev in Thread] Current Thread [Next in Thread]