PATCH: Fix for JSON output format

Thomas Mainka <[email protected]> Wed, 05 Sep 2012 22:32:44 +0200
Newsgroups gmane.comp.db.rrdtool.devel
Message-ID <[email protected]>
Hi everyone,


Recently I have experimented with dynamic graphing of RRDtool data on 
web pages (as JSON data queried by jQuery). While the JSON export and 
transport worked fine, after some testing I realized that starting with 
version 1.4 jQuery rejects JSON data which it thinks is malformed. When 
directly fed the output output of "rrdtool xport --json" jQuery barfs 
with an syntax error.

Of course there are workarounds, but the attached fix is pretty trivial: 
Only the double quotes were missing in most of the JSON output from 
RRDtool to pass the jQuery test. The JSON standard is pretty strict on 
strings and requires any string to be wrapped in double quotes: 
http://json.org/

Personally I have also tested the resulting output with 
http://jsonlint.org/ and http://www.jsoneditoronline.org/ which both 
worked for me. YMMV, though.


Regards,
Thomas

_______________________________________________
rrd-developers mailing list
[email protected]
https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
rrdtool-json.patch (text/plain, 1.5 KB)
--- ../rrdtool-1.4.7.orig/src/rrd_tool.c	2012-01-24 11:08:48.000000000 +0100
+++ src/rrd_tool.c	2012-09-05 17:11:34.471626553 +0200
@@ -737,13 +737,13 @@
                 printf("  <%s>\n", META_TAG);
             }
             else {
-                printf("{ about: 'RRDtool xport JSON output',\n  meta: {\n");
+                printf("{ \"about\": \"RRDtool xport JSON output\",\n  \"meta\": {\n");
             }
 
 
 #define pXJV(indent,fmt,tag,value) \
             if (json) { \
-               printf(indent "%s: " fmt ",\n",tag,value); \
+               printf(indent "\"%s\": " fmt ",\n",tag,value); \
             } else { \
                printf(indent "<%s>" fmt "</%s>\n",tag,value,tag); \
             }
@@ -757,7 +757,7 @@
             }
              
             if (json){
-                printf("    %s: [\n", LEGEND_TAG);
+                printf("    \"%s\": [\n", LEGEND_TAG);
             }
             else {
                 printf("    <%s>\n", LEGEND_TAG);
@@ -766,7 +766,7 @@
                 char     *entry = NULL;
                 entry = legend_v[j];
                 if (json){
-                    printf("      '%s'", entry);
+                    printf("      \"%s\"", entry);
                     if (j < col_cnt -1){
                         printf(",");
                     }
@@ -788,7 +788,7 @@
             }
             
             if (json){
-                printf("  %s: [\n",DATA_TAG);
+                printf("  \"%s\": [\n",DATA_TAG);
             } else {
                 printf("  <%s>\n", DATA_TAG);
             }