1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
#include <u.h>
#include <libc.h>
#include <json.h>
static int printjson(Fmt*, JSON*, int);
static int printarray(Fmt*, JSON*, int);
static int printobject(Fmt*, JSON*, int);
static int
printarray(Fmt *f, JSON *j, int indent)
{
JSONEl *jl;
int i, r;
if(j->first == nil){
return fmtprint(f, "[]");
}
r = fmtprint(f, "[\n");
for(jl = j->first; jl != nil; jl = jl->next){
for(i = 0; i < indent; i++)
r += fmtprint(f, "\t");
r += printjson(f, jl->val, indent);
r += fmtprint(f, "%s\n", jl->next != nil ? "," : "");
}
for(i = 0; i < indent-1; i++)
r += fmtprint(f, "\t");
r += fmtprint(f, "]");
return r;
}
static int
printobject(Fmt *f, JSON *j, int indent)
{
JSONEl *jl;
int i, r;
if(j->first == nil){
return fmtprint(f, "{}");
}
r = fmtprint(f, "{\n");
for(jl = j->first; jl != nil; jl = jl->next){
for(i = 0; i < indent; i++)
fmtprint(f, "\t");
r += fmtprint(f, "\"%s\": ", jl->name);
r += printjson(f, jl->val, indent);
r += fmtprint(f, "%s\n", jl->next != nil ? "," : "");
}
for(i = 0; i < indent-1; i++)
r += fmtprint(f, "\t");
r += fmtprint(f, "}");
return r;
}
static int
printjson(Fmt *f, JSON *j, int indent)
{
switch(j->t){
case JSONNull:
return fmtprint(f, "null");
break;
case JSONBool:
return fmtprint(f, "%s", j->n ? "true" : "false");
break;
case JSONNumber:
return fmtprint(f, "%f", j->n);
break;
case JSONString:
return fmtprint(f, "\"%s\"", j->s);
break;
case JSONArray:
return printarray(f, j, indent+1);
break;
case JSONObject:
return printobject(f, j, indent+1);
break;
}
return 0;
}
int
JSONfmt(Fmt *f)
{
JSON *j;
j = va_arg(f->args, JSON*);
return printjson(f, j, 0);
}
void
JSONfmtinstall(void)
{
fmtinstall('J', JSONfmt);
}
|