On Tue, Nov 07, 2017 at 02:05:25PM +0100, Martin Kletzander wrote:
Hi everyone,
so we are using yajl for parsing JSON. However there are some reasons
why we might consider switching to another one:
1) It is basically dead upstream
One could say that it is simply "feature complete" upstream so doesn't
need more work, but none the less, I have a general bad feeling about
relying on a library with no active maint work going on for best part
of 4 years, and 68 open pull requests.
2) We're just using the lexer part of it
3) We only use it for parsing
Aren't 2 & 3 the same point repeated ? Regardless though, we use yajl
for formatting JSON too (virJSONValueToString)
4) The are workarounds for it in the code
I don't recall what these are now ?
So I looked at some options and found few other libraries, I only
took
those that are widely available (read: I checked if some random
downstream distro has them), however most of them were not very much
usable. Except one. But here's the list of few others that didn't look
that bad either. All are MIT-licensed, try to be thread-safe and
support pkg-config:
- libfastjson [1] - from rsyslog community, optimized for working with
logs, used almost only by rsyslog, it's supposed to
have doxygen docs, they switched to libfastjson
from json-c due to some problems with it
(performance, ref counting bug, ...)
If its only used by 1 app, I would stay well clear of it, as that's just
one step away from be unused and dead.
- json-c [2] - looked abandoned until I looked at the proper github
page, "documentation" in doxygen
Yeah, this is the main one I know about and existed way back when I
picked yajl originally.
It has plenty of apps using it in Fedora, which is good.
At first the header files look to have good namespacing, but then I
see horrific things like this polluting the namespaces:
#undef FALSE
#define FALSE ((json_bool)0)
#undef TRUE
#define TRUE ((json_bool)1)
#define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9)
#define error_ptr(error) ((void*)error)
#define error_description(error) (json_tokener_errors[error])
#define is_error(ptr) (ptr == NULL)
- Jansson [3] - I really like this one. The API seems very
intuitive,
it has nice documentation [4] in readthedocs (and I'm
not talking about the visual style, but how easy is to
find information), it can be used for formatting JSON
in a similar way we are doing it. It has json_auto_t
(optional) type that uses the attribute cleanup for
automatic scope dereference (just in case we want to
use it), it has iterators... did I tell you I like this
one a lot?
Like yajl did, they seem to have had an explicit ABI break at their 2.0
version, which was released in 2011. Not a big deal if we only support
their 2.x series, especially if we keep yajl as an optional fallback
It has 15 open PRs and 32 open bugs, but unlike yajl it actually has
active development taking place
Its header namespace looks clean too.
What do you (others) think of switching the JSON library? Do you
know
about any other projects that could be used considering license,
platform support, etc.? Also feel free to fix any mistakes I might have
posted. I double-checked it, but you know, "trust, but verify".
I'd be broadly in favour of switching to something that is not dead :-)
I agree that Jansson appears the most promising.
I think we would have to keep yajl support in parallel, but that's not
too hard, since this is all isolated in virjson.c
Regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|