int keys_count(json_object * jo){ int count = 0; json_object_object_foreach(jo, key, val) count++; return count; }
static xr_value* _xr_value_unserialize_json(struct json_object* obj) { switch (json_object_get_type(obj)) { case json_type_null: g_return_val_if_reached(NULL); case json_type_boolean: return xr_value_bool_new(json_object_get_boolean(obj)); case json_type_double: return xr_value_double_new(json_object_get_double(obj)); case json_type_int: return xr_value_int_new(json_object_get_int(obj)); case json_type_object: { xr_value* str = xr_value_struct_new(); json_object_object_foreach(obj, key, val) xr_value_struct_set_member(str, key, _xr_value_unserialize_json(val)); return str; } case json_type_array: { int i; xr_value* arr = xr_value_array_new(); const int arr_len = json_object_array_length(obj); for (i = 0; i < arr_len; i++) xr_value_array_append(arr, _xr_value_unserialize_json(json_object_array_get_idx(obj, i))); return arr; } case json_type_string: return xr_value_string_new(json_object_get_string(obj)); } g_return_val_if_reached(NULL); }