5 https://gitlab.gnome.org/GNOME/json-glib/-/blob/master/json-glib/json-generator.c
7 note - that could probably be fixed by just adding the sort method on members List..
12 public class JsonGen : Object
15 Json.Generator generator;
17 public bool pretty = true;
18 public int indent = 1;
19 public char indent_char = ' ';
20 public JsonGen( Json.Node node )
23 this.generator = new Json.Generator ();
24 this.generator.indent = this.indent;
25 this.generator.pretty = this.pretty;
30 public string to_data()
32 var buffer = new GLib.StringBuilder();
33 dump_node(buffer,0, this.node, "", false);
40 GLib.StringBuilder buffer,
51 for (var i = 0; i < (level * this.indent); i++) {
52 buffer.append_c(this.indent_char);
58 // initiate a node as a string... then output it..
59 //buffer.append_c( '"'); // might not be needed..
60 var k = new Json.Node(Json.NodeType.VALUE);
64 //buffer.append_c( '"');
67 buffer.append( " : ");
69 buffer.append_c( ':');
73 switch (node.get_node_type()) {
74 case Json.NodeType.NULL:
75 buffer.append( "null");
78 case Json.NodeType.VALUE:
80 this.generator.set_root(node);
81 var str = this.generator.to_data(out sl);
86 case Json.NodeType.ARRAY:
87 this.dump_array ( buffer, level, node.get_array());
90 case Json.NodeType.OBJECT:
91 this.dump_object (buffer, level, node.get_object());
96 void dump_value (GLib.StringBuilder buffer, Json.Node node)
99 this.generator.set_root(node);
100 buffer.append( this.generator.to_data(out slen) );
104 GLib.StringBuilder buffer,
110 var array_len = array.get_length();
112 var pretty = this.pretty;
115 buffer.append_c( '[');
117 if (array_len == 0) {
118 buffer.append_c( ']');
122 for (var i = 0; i < array_len; i++) {
123 var cur = array.get_element ( i);
125 if (i == 0 && pretty) {
126 buffer.append_c('\n');
128 this.dump_node ( buffer, level + 1, cur, "", false);
130 if ((i + 1) != array_len) {
131 buffer.append_c( ',');
134 buffer.append_c( '\n');
139 for (var i = 0; i < (level * this.indent); i++) {
140 buffer.append_c(this.indent_char);
144 buffer.append_c( ']');
148 GLib.StringBuilder buffer,
154 var pretty = this.pretty;
158 buffer.append_c('{');
159 buffer.append_c( '\n');
160 var members = object.get_members();
161 members.sort(GLib.strcmp);
164 members.foreach ( (member_name) => {
167 var cur = object.get_member( member_name);
169 //if (mi > 0 && pretty) {
170 // buffer.append_c( '\n');
173 dump_node (buffer, level + 1, cur, member_name, true);
175 if (mi < members.length()-1) {
176 buffer.append_c( ',');
179 buffer.append_c( '\n');
185 for (var i = 0; i < (level * this.indent); i++) {
186 buffer.append_c( this.indent_char);
190 buffer.append_c( '}');
202 valac --pkg json-glib-1.0 -D JSON_TESTCODE Json.vala
206 void main (string[] args) {
209 {"quiz":{"sport":{"q1":{"question":"Which one is correct team name in NBA?","options":["New York Bulls",
210 "Los Angeles Kings","Golden State Warriros","Huston Rocket"],"answer":"Huston Rocket"}},"maths":
211 {"q1":{"question":"5 + 7 = ?","options":["10","11","12","13"],"answer":"12"},"q2":
212 {"question":"12 - 8 = ?","options":["1","2","3","4"],"answer":"4"}}}}
214 var parser = new Json.Parser ();
215 parser.load_from_data(testjson);
217 var node = parser.get_root ();
219 var js = new JsRender.JsonGen(node);
220 print("OUT: %s", js.to_data());