提交 212b6008 编写于 作者: D Daniel P. Berrange 提交者: Luiz Capitulino

Add support for JSON pretty printing

The monitor does not pretty-print JSON output, so that everything
will be on a single line reply. When JSON docs get large this is
quite unpleasant to read. For the future command line capabilities
query ability, huge JSON docs will be available. This needs the
ability to pretty-print.

This introduces a new API qobject_to_json_pretty() that does
a minimal indentation of list and dict members. As an example,
this makes

  {"QMP": {"version": {"micro": 50, "minor": 12, "package": "", "major": 0}, "capabilities": []}}

Output as

  {
      "QMP": {
          "version": {
              "micro": 50,
              "minor": 12,
              "package": "",
              "major": 0
          },
          "capabilities": [
          ]
      }
  }

NB: this is not turned on for the QMP monitor.
Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
Signed-off-by: NLuiz Capitulino <lcapitulino@redhat.com>
上级 2c50e26e
...@@ -72,43 +72,57 @@ QObject *qobject_from_jsonf(const char *string, ...) ...@@ -72,43 +72,57 @@ QObject *qobject_from_jsonf(const char *string, ...)
typedef struct ToJsonIterState typedef struct ToJsonIterState
{ {
int indent;
int pretty;
int count; int count;
QString *str; QString *str;
} ToJsonIterState; } ToJsonIterState;
static void to_json(const QObject *obj, QString *str); static void to_json(const QObject *obj, QString *str, int pretty, int indent);
static void to_json_dict_iter(const char *key, QObject *obj, void *opaque) static void to_json_dict_iter(const char *key, QObject *obj, void *opaque)
{ {
ToJsonIterState *s = opaque; ToJsonIterState *s = opaque;
QString *qkey; QString *qkey;
int j;
if (s->count) { if (s->count)
qstring_append(s->str, ", "); qstring_append(s->str, ", ");
if (s->pretty) {
qstring_append(s->str, "\n");
for (j = 0 ; j < s->indent ; j++)
qstring_append(s->str, " ");
} }
qkey = qstring_from_str(key); qkey = qstring_from_str(key);
to_json(QOBJECT(qkey), s->str); to_json(QOBJECT(qkey), s->str, s->pretty, s->indent);
QDECREF(qkey); QDECREF(qkey);
qstring_append(s->str, ": "); qstring_append(s->str, ": ");
to_json(obj, s->str); to_json(obj, s->str, s->pretty, s->indent);
s->count++; s->count++;
} }
static void to_json_list_iter(QObject *obj, void *opaque) static void to_json_list_iter(QObject *obj, void *opaque)
{ {
ToJsonIterState *s = opaque; ToJsonIterState *s = opaque;
int j;
if (s->count) { if (s->count)
qstring_append(s->str, ", "); qstring_append(s->str, ", ");
if (s->pretty) {
qstring_append(s->str, "\n");
for (j = 0 ; j < s->indent ; j++)
qstring_append(s->str, " ");
} }
to_json(obj, s->str); to_json(obj, s->str, s->pretty, s->indent);
s->count++; s->count++;
} }
static void to_json(const QObject *obj, QString *str) static void to_json(const QObject *obj, QString *str, int pretty, int indent)
{ {
switch (qobject_type(obj)) { switch (qobject_type(obj)) {
case QTYPE_QINT: { case QTYPE_QINT: {
...@@ -193,8 +207,16 @@ static void to_json(const QObject *obj, QString *str) ...@@ -193,8 +207,16 @@ static void to_json(const QObject *obj, QString *str)
s.count = 0; s.count = 0;
s.str = str; s.str = str;
s.indent = indent + 1;
s.pretty = pretty;
qstring_append(str, "{"); qstring_append(str, "{");
qdict_iter(val, to_json_dict_iter, &s); qdict_iter(val, to_json_dict_iter, &s);
if (pretty) {
int j;
qstring_append(str, "\n");
for (j = 0 ; j < indent ; j++)
qstring_append(str, " ");
}
qstring_append(str, "}"); qstring_append(str, "}");
break; break;
} }
...@@ -204,8 +226,16 @@ static void to_json(const QObject *obj, QString *str) ...@@ -204,8 +226,16 @@ static void to_json(const QObject *obj, QString *str)
s.count = 0; s.count = 0;
s.str = str; s.str = str;
s.indent = indent + 1;
s.pretty = pretty;
qstring_append(str, "["); qstring_append(str, "[");
qlist_iter(val, (void *)to_json_list_iter, &s); qlist_iter(val, (void *)to_json_list_iter, &s);
if (pretty) {
int j;
qstring_append(str, "\n");
for (j = 0 ; j < indent ; j++)
qstring_append(str, " ");
}
qstring_append(str, "]"); qstring_append(str, "]");
break; break;
} }
...@@ -249,7 +279,16 @@ QString *qobject_to_json(const QObject *obj) ...@@ -249,7 +279,16 @@ QString *qobject_to_json(const QObject *obj)
{ {
QString *str = qstring_new(); QString *str = qstring_new();
to_json(obj, str); to_json(obj, str, 0, 0);
return str;
}
QString *qobject_to_json_pretty(const QObject *obj)
{
QString *str = qstring_new();
to_json(obj, str, 1, 0);
return str; return str;
} }
...@@ -24,5 +24,6 @@ QObject *qobject_from_jsonf(const char *string, ...) ...@@ -24,5 +24,6 @@ QObject *qobject_from_jsonf(const char *string, ...)
QObject *qobject_from_jsonv(const char *string, va_list *ap); QObject *qobject_from_jsonv(const char *string, va_list *ap);
QString *qobject_to_json(const QObject *obj); QString *qobject_to_json(const QObject *obj);
QString *qobject_to_json_pretty(const QObject *obj);
#endif /* QJSON_H */ #endif /* QJSON_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册