1 #define __STRICT_ANSI__ 1
2
3 #include <bson.h>
4 #include <json.h>
5
6 #include <stdio.h>
tut_bson(void)7 #include <unistd.h>
8 #include <glib.h>
9
10 static bson *json_to_bson (struct json_object *json);
11
12 static void
13 json_key_to_bson_key (bson *b, void *val,
14 const gchar *key)
15 {
16 switch (json_object_get_type (val))
17 {
18 case json_type_boolean:
19 bson_append_boolean (b, key, json_object_get_boolean (val));
20 break;
21 case json_type_double:
22 bson_append_double (b, key, json_object_get_double (val));
23 break;
24 case json_type_int:
25 bson_append_int32 (b, key, json_object_get_int (val));
26 break;
27 case json_type_string:
28 bson_append_string (b, key, json_object_get_string (val), -1);
29 break;
30 case json_type_object:
31 {
32 bson *sub;
main(void)33
34 sub = json_to_bson (val);
35 bson_append_document (b, key, sub);
36 bson_free (sub);
37 break;
38 }
39 case json_type_array:
40 {
41 gint pos;
42 bson *sub;
43
44 sub = bson_new ();
45
46 for (pos = 0; pos < json_object_array_length (val); pos++)
47 {
48 gchar *nk = g_strdup_printf ("%d", pos);
49
50 json_key_to_bson_key (sub, json_object_array_get_idx (val, pos),
51 nk);
52 g_free (nk);
53 }
54 bson_finish (sub);
55
56 bson_append_array (b, key, sub);
57 bson_free (sub);
58 break;
59 }
60 default:
61 break;
62 }
63 }
64
65 static void
66 json_to_bson_foreach (bson *b, struct json_object *json)
67 {
68 json_object_object_foreach (json, key, val)
69 {
70 json_key_to_bson_key (b, val, key);
71 }
72 }
73
74 static bson *
75 json_to_bson (struct json_object *json)
76 {
77 bson *b;
78
79 b = bson_new ();
80 json_to_bson_foreach (b, json);
81 bson_finish (b);
82
83 return b;
84 }
85
86 int
87 main (int argc, char **argv)
88 {
89 GIOChannel *input;
90 GString *json_str;
91 GError *error = NULL;
92 struct json_tokener *tokener;
93
94 input = g_io_channel_unix_new (0);
95
96 json_str = g_string_new (NULL);
97 tokener = json_tokener_new ();
98
99 while (g_io_channel_read_line_string (input, json_str,
100 NULL, &error) == G_IO_STATUS_NORMAL)
101 {
102 struct json_object *json;
103 bson *bson;
104
105 json_tokener_reset (tokener);
106
107 json = json_tokener_parse_ex (tokener, json_str->str, json_str->len);
108 if (!json)
109 {
110 fprintf (stderr, "Error parsing json: %s\n", json_str->str);
111 break;
112 }
113
114 if (json_object_get_type (json) != json_type_object)
115 {
116 fprintf (stderr,
117 "Error: json's top-level object is not object: %s\n",
118 json_str->str);
119 json_object_put (json);
120 break;
121 }
122
123 bson = json_to_bson (json);
124 json_object_put (json);
125
126 write (1, bson_data (bson), bson_size (bson));
127
128 bson_free (bson);
129 }
130
131 return 0;
132 }
133