Paolo Bonzini <pbonz...@redhat.com> writes: > On 24/11/2015 06:22, Fam Zheng wrote: >> case OFORMAT_JSON: >> - printf("%s{ \"start\": %"PRId64", \"length\": %"PRId64", \"depth\": >> %d," >> - " \"zero\": %s, \"data\": %s", >> - (e->start == 0 ? "[" : ",\n"), >> - e->start, e->length, e->depth, >> - (e->flags & BDRV_BLOCK_ZERO) ? "true" : "false", >> - (e->flags & BDRV_BLOCK_DATA) ? "true" : "false"); >> + if (e->start == 0) { >> + printf("["); >> + } else { >> + printf(","); >> + } >> + >> + dict = qdict_new(); >> + qdict_put(dict, "start", qint_from_int(e->start)); >> + qdict_put(dict, "length", qint_from_int(e->length)); >> + qdict_put(dict, "depth", qint_from_int(e->depth)); >> + qdict_put(dict, "zero", qbool_from_bool(e->flags & >> BDRV_BLOCK_ZERO)); >> + qdict_put(dict, "data", qbool_from_bool(e->flags & >> BDRV_BLOCK_DATA)); >> if (e->flags & BDRV_BLOCK_OFFSET_VALID) { >> - printf(", \"offset\": %"PRId64"", e->offset); >> + qdict_put(dict, "offset", qint_from_int(e->offset)); >> } >> - putchar('}'); >> + str = qobject_to_json(QOBJECT(dict)); >> + printf("%s\n", qstring_get_str(str)); > > I think it's better if you use QAPI for this. You can make MapEntry a > QAPI struct and generate the QObject through a QMP visitor. > > The reason is that we could add JSON visitors that let us parse or > produce JSON without going through the expensive QObject creation. Even > though that is far away, the least explicit QObject manipulation we > have, the better.
I concur. Manual messing with QDict is of course fine when a higher-level interface doesn't fit. But here, we serialize a struct to JSON, and that's something QAPI is meant to do. Having to define a QAPI type may be a bit of a bother, but once that's done, the "serialize this struct to JSON" code becomes less tedious. qemu-img.c already has a few examples; search for qmp_output_visitor_new().