/* * A simple JSON writer * * Copyright Alexander Graf * * Authors: * Alexander Graf * * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. * See the COPYING.LIB file in the top-level directory. * */ /* * Type QJSON lets you build JSON text. Its interface mirrors (a * subset of) abstract JSON syntax. * * It does *not* detect incorrect use. It happily produces invalid * JSON then. This is what migration wants. * * QAPI output visitors also produce JSON text. However, they do * assert their preconditions and invariants, and therefore abort on * incorrect use. */ #include "qemu/osdep.h" #include "qapi/qmp/qstring.h" #include "migration/qjson.h" struct QJSON { QString *str; bool omit_comma; }; static void json_emit_element(QJSON *json, const char *name) { /* Check whether we need to print a , before an element */ if (json->omit_comma) { json->omit_comma = false; } else { qstring_append(json->str, ", "); } if (name) { qstring_append(json->str, "\""); qstring_append(json->str, name); qstring_append(json->str, "\" : "); } } void json_start_object(QJSON *json, const char *name) { json_emit_element(json, name); qstring_append(json->str, "{ "); json->omit_comma = true; } void json_end_object(QJSON *json) { qstring_append(json->str, " }"); json->omit_comma = false; } void json_start_array(QJSON *json, const char *name) { json_emit_element(json, name); qstring_append(json->str, "[ "); json->omit_comma = true; } void json_end_array(QJSON *json) { qstring_append(json->str, " ]"); json->omit_comma = false; } void json_prop_int(QJSON *json, const char *name, int64_t val) { json_emit_element(json, name); qstring_append_int(json->str, val); } void json_prop_str(QJSON *json, const char *name, const char *str) { json_emit_element(json, name); qstring_append_chr(json->str, '"'); qstring_append(json->str, str); qstring_append_chr(json->str, '"'); } const char *qjson_get_str(QJSON *json) { return qstring_get_str(json->str); } QJSON *qjson_new(void) { QJSON *json = g_new0(QJSON, 1); json->str = qstring_from_str("{ "); json->omit_comma = true; return json; } void qjson_finish(QJSON *json) { json_end_object(json); } void qjson_destroy(QJSON *json) { QDECREF(json->str); g_free(json); }