json and prettyprint
This commit is contained in:
parent
887d43428b
commit
ef3c98518a
2 changed files with 103 additions and 19 deletions
|
|
@ -28,7 +28,7 @@
|
||||||
*/
|
*/
|
||||||
int json_parse_str(char *str, cxobj **xt);
|
int json_parse_str(char *str, cxobj **xt);
|
||||||
|
|
||||||
int xml2json_cbuf(cbuf *cb, cxobj *x, int level);
|
int xml2json_cbuf(cbuf *cb, cxobj *x, int pretty);
|
||||||
int xml2json(FILE *f, cxobj *x, int level);
|
int xml2json(FILE *f, cxobj *x, int pretty);
|
||||||
|
|
||||||
#endif /* _CLIXON_JSON_H */
|
#endif /* _CLIXON_JSON_H */
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,72 @@
|
||||||
*
|
*
|
||||||
* JSON support functions.
|
* JSON support functions.
|
||||||
|
|
||||||
|
curl -G http://localhost/api/data/sender/userid=a4315f60-e890-4f8f-9a0b-eb53d4da2d3a
|
||||||
|
|
||||||
|
[{
|
||||||
|
"sender": {
|
||||||
|
"name": "dk-ore",
|
||||||
|
"userid": "a4315f60-e890-4f8f-9a0b-eb53d4da2d3a",
|
||||||
|
"ipv4_daddr": "109.105.110.78",
|
||||||
|
"template": "nordunet",
|
||||||
|
"version": "0",
|
||||||
|
"description": "Nutanix ORE",
|
||||||
|
"start": "true",
|
||||||
|
"udp_dport": "43713",
|
||||||
|
"debug": "0",
|
||||||
|
"proto": "udp"
|
||||||
|
}
|
||||||
|
|
||||||
|
is translated into this:
|
||||||
|
[
|
||||||
|
{"sender":
|
||||||
|
["name":"dk-ore",
|
||||||
|
"userid":"a4315f60-e890-4f8f-9a0b-eb53d4da2d3a",
|
||||||
|
"ipv4_daddr":"109.105.110.78",
|
||||||
|
"template":"nordunet",
|
||||||
|
"version":"0",
|
||||||
|
"description":"Nutanix ORE",
|
||||||
|
"start":"true",
|
||||||
|
"udp_dport":"43713",
|
||||||
|
"debug":"0",
|
||||||
|
"proto":"udp"}
|
||||||
|
,
|
||||||
|
{"name":"dk-uni",
|
||||||
|
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
<t>
|
||||||
|
<sender>
|
||||||
|
<name>hunerik</name>
|
||||||
|
</sender>
|
||||||
|
<sender>
|
||||||
|
<name>foo</name>
|
||||||
|
</sender>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
{ "t":
|
||||||
|
{
|
||||||
|
"sender": {
|
||||||
|
"name": "hunerik"
|
||||||
|
},
|
||||||
|
"sender": {
|
||||||
|
"name": "foo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"t": {
|
||||||
|
"sender": [
|
||||||
|
{ "name": "hunerik" },
|
||||||
|
{ "name": "foo" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OK, still something wrong with grafana plots
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
@ -47,6 +113,7 @@
|
||||||
#include "clixon_json.h"
|
#include "clixon_json.h"
|
||||||
#include "clixon_json_parse.h"
|
#include "clixon_json_parse.h"
|
||||||
|
|
||||||
|
#define INDENT 2 /* maybe we should set this programmatically? */
|
||||||
|
|
||||||
/*! x is element and has eactly one child which in turn has none
|
/*! x is element and has eactly one child which in turn has none
|
||||||
* Clone from clixon_xml_map.c
|
* Clone from clixon_xml_map.c
|
||||||
|
|
@ -113,6 +180,7 @@ list_eval(cxobj *x)
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* List only if adjacent,
|
* List only if adjacent,
|
||||||
* ie <a>1</a><a>2</a><b>3</b> -> {"a":[1,2],"b":3}
|
* ie <a>1</a><a>2</a><b>3</b> -> {"a":[1,2],"b":3}
|
||||||
|
|
@ -120,7 +188,9 @@ list_eval(cxobj *x)
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
xml2json1_cbuf(cbuf *cb,
|
xml2json1_cbuf(cbuf *cb,
|
||||||
cxobj *x)
|
cxobj *x,
|
||||||
|
int level,
|
||||||
|
int pretty)
|
||||||
{
|
{
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
int i;
|
int i;
|
||||||
|
|
@ -129,7 +199,6 @@ xml2json1_cbuf(cbuf *cb,
|
||||||
|
|
||||||
switch(xml_type(x)){
|
switch(xml_type(x)){
|
||||||
case CX_BODY:
|
case CX_BODY:
|
||||||
fprintf(stderr, "%s body %s\n", __FUNCTION__, xml_value(x));
|
|
||||||
if (xml_value(x))
|
if (xml_value(x))
|
||||||
cprintf(cb, "\"%s\"", xml_value(x));
|
cprintf(cb, "\"%s\"", xml_value(x));
|
||||||
else
|
else
|
||||||
|
|
@ -137,33 +206,44 @@ xml2json1_cbuf(cbuf *cb,
|
||||||
break;
|
break;
|
||||||
case CX_ELMNT:
|
case CX_ELMNT:
|
||||||
list = list_eval(x);
|
list = list_eval(x);
|
||||||
fprintf(stderr, "%s element %s\n", __FUNCTION__, xml_name(x));
|
|
||||||
switch (list){
|
switch (list){
|
||||||
case LIST_NO:
|
case LIST_NO:
|
||||||
cprintf(cb, "\"%s\":", xml_name(x));
|
cprintf(cb, "%*s\"%s\": ", pretty?(level*INDENT):0, "",xml_name(x));
|
||||||
if (!tleaf(x))
|
if (!tleaf(x))
|
||||||
cprintf(cb, "{");
|
cprintf(cb, "{%s", pretty?"\n":"");
|
||||||
break;
|
break;
|
||||||
case LIST_FIRST:
|
case LIST_FIRST:
|
||||||
cprintf(cb, "\"%s\":[", xml_name(x));
|
cprintf(cb, "\"%*s\":[", pretty?(level*INDENT):0, xml_name(x));
|
||||||
|
if (!tleaf(x))
|
||||||
|
cprintf(cb, "{%s", pretty?"\n":"");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (i=0; i<xml_child_nr(x); i++){
|
for (i=0; i<xml_child_nr(x); i++){
|
||||||
xc = xml_child_i(x, i);
|
xc = xml_child_i(x, i);
|
||||||
if (xml2json1_cbuf(cb, xc) < 0)
|
if (xml2json1_cbuf(cb, xc, level+1, pretty) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
if (i<xml_child_nr(x)-1)
|
if (i<xml_child_nr(x)-1){
|
||||||
cprintf(cb, ",");
|
cprintf(cb, ",");
|
||||||
|
cprintf(cb, "%s", pretty?"\n":"");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
switch (list){
|
switch (list){
|
||||||
case LIST_NO:
|
case LIST_NO:
|
||||||
if (!tleaf(x))
|
if (!tleaf(x))
|
||||||
cprintf(cb, "}");
|
cprintf(cb, "%s%*s}%s",
|
||||||
|
pretty?"\n":"",
|
||||||
|
pretty?(level*INDENT):0,"",
|
||||||
|
pretty?"\n":"");
|
||||||
break;
|
break;
|
||||||
case LIST_LAST:
|
case LIST_LAST:
|
||||||
cprintf(cb, "]");
|
if (!tleaf(x))
|
||||||
|
cprintf(cb, "%s%*s}%s",
|
||||||
|
pretty?"\n":"",
|
||||||
|
pretty?(level*INDENT):0,"",
|
||||||
|
pretty?"\n":"");
|
||||||
|
cprintf(cb, "]%s",pretty?"\n":"");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
@ -177,7 +257,6 @@ xml2json1_cbuf(cbuf *cb,
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*! Translate an XML tree to JSON in a CLIgen buffer
|
/*! Translate an XML tree to JSON in a CLIgen buffer
|
||||||
*
|
*
|
||||||
* @param[in,out] cb Cligen buffer to write to
|
* @param[in,out] cb Cligen buffer to write to
|
||||||
|
|
@ -198,14 +277,19 @@ xml2json1_cbuf(cbuf *cb,
|
||||||
int
|
int
|
||||||
xml2json_cbuf(cbuf *cb,
|
xml2json_cbuf(cbuf *cb,
|
||||||
cxobj *x,
|
cxobj *x,
|
||||||
int level)
|
int pretty)
|
||||||
{
|
{
|
||||||
int retval = 1;
|
int retval = 1;
|
||||||
|
int level = 1;
|
||||||
|
|
||||||
cprintf(cb, "{");
|
cprintf(cb, "%*s{%s",
|
||||||
if (xml2json1_cbuf(cb, x) < 0)
|
pretty?(level*INDENT):0,"",
|
||||||
|
pretty?"\n":"");
|
||||||
|
if (xml2json1_cbuf(cb, x, level+1, pretty) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
cprintf(cb, "}\n");
|
cprintf(cb, "%*s}%s",
|
||||||
|
pretty?(level*INDENT):0,"",
|
||||||
|
pretty?"\n":"");
|
||||||
retval = 0;
|
retval = 0;
|
||||||
done:
|
done:
|
||||||
return retval;
|
return retval;
|
||||||
|
|
@ -226,7 +310,7 @@ xml2json_cbuf(cbuf *cb,
|
||||||
int
|
int
|
||||||
xml2json(FILE *f,
|
xml2json(FILE *f,
|
||||||
cxobj *x,
|
cxobj *x,
|
||||||
int level)
|
int pretty)
|
||||||
{
|
{
|
||||||
int retval = 1;
|
int retval = 1;
|
||||||
cbuf *cb;
|
cbuf *cb;
|
||||||
|
|
@ -235,7 +319,7 @@ xml2json(FILE *f,
|
||||||
clicon_err(OE_XML, errno, "cbuf_new");
|
clicon_err(OE_XML, errno, "cbuf_new");
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (xml2json_cbuf(cb, x, level) < 0)
|
if (xml2json_cbuf(cb, x, pretty) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
retval = 0;
|
retval = 0;
|
||||||
done:
|
done:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue