From: Ján Tomko Date: Thu, 15 Feb 2024 15:21:23 +0000 (+0100) Subject: util: json: introduce virJSONStringPrettifyBlanks X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=330cf7f492f93dafc1477f900bb2cb641e5e7efe;p=libvirt.git util: json: introduce virJSONStringPrettifyBlanks A horribly named function for unifying formatting when pretty-printing empty JSON arrays and objects. Useful for having stable test output even if different JSON libraries format these differently. Signed-off-by: Ján Tomko Reviewed-by: Peter Krempa --- diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f15d16c292..02dacea857 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2613,6 +2613,7 @@ virISCSIScanTargets; # util/virjson.h +virJSONStringPrettifyBlanks; virJSONStringReformat; virJSONValueArrayAppend; virJSONValueArrayAppendString; diff --git a/src/util/virjson.c b/src/util/virjson.c index 57707350da..0edf86cd1c 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -1861,6 +1861,40 @@ virJSONStringReformat(const char *jsonstr, return virJSONValueToString(json, pretty); } +/** + * virJSONStringPrettifyBlanks: + * @jsonstr: string to prettify + * + * In the pretty mode of printing, various versions of JSON libraries + * format empty arrays and objects differently. + * + * Unify this to "[]" and "{}" which are used by json-c 0.17 and newer. + * https://github.com/json-c/json-c/issues/778 + * + * This format is also used by Python's 'json.dump' method. + * + * Returns the reformatted JSON string on success. + */ +char *virJSONStringPrettifyBlanks(const char *jsonstr) +{ + virBuffer buf = VIR_BUFFER_INITIALIZER; + const char *p; + + for (p = jsonstr; *p && p[1]; p++) { + virBufferAddChar(&buf, *p); + + if ((p[0] == '{' || p[0] == '[') && p[1] == '\n') { + const char *q = p + 1; + + virSkipSpaces(&q); + + if (*q == '}' || *q == ']') + p = q - 1; + } + } + + return virBufferContentAndReset(&buf); +} static virJSONValue * virJSONValueObjectDeflattenKeys(virJSONValue *json); diff --git a/src/util/virjson.h b/src/util/virjson.h index e622798fe7..d8481e5890 100644 --- a/src/util/virjson.h +++ b/src/util/virjson.h @@ -271,6 +271,8 @@ virJSONValueCopy(const virJSONValue *in); char * virJSONStringReformat(const char *jsonstr, bool pretty); +char * +virJSONStringPrettifyBlanks(const char *jsonstr); virJSONValue * virJSONValueObjectDeflatten(virJSONValue *json);