static int excavate_json_object (JsonNode *node, int *n_objects, PRN *prn) { JsonObject *obj = json_node_get_object(node); int err = 0; if (obj == NULL) { return E_DATA; } if (json_object_get_size(obj) > 0) { GList *list = json_object_get_values(obj); struct jsdata jsd = { n_objects, &err, prn }; list = json_object_get_values(obj); g_list_foreach(list, show_obj_value, &jsd); g_list_free(list); } return err; }
/*! * Recursive function that handles converging \c JsonNode's to \c * GNode's. * * \param root \c Root JsonNode to convert. * \param node \c GNode. * \param parsing_array \c true if handling an array, else \c false. */ static void clr_oci_json_parse_aux(JsonNode* root, GNode* node, bool parsing_array) { guint i; g_assert (root); g_assert (node); if (JSON_NODE_TYPE(root) == JSON_NODE_OBJECT) { JsonObject *object = json_node_get_object(root); if (object) { guint j; guint size; GList* keys, *key = NULL; GList* values, *value = NULL; size = json_object_get_size(object); keys = json_object_get_members(object); values = json_object_get_values(object); node = g_node_append(node, g_node_new(NULL)); for (j = 0, key = keys, value = values; j < size; j++) { if (key) { node = g_node_append(node->parent, g_node_new(g_strdup(key->data))); } if (value) { clr_oci_json_parse_aux(value->data, node, false); } key = g_list_next(key); value = g_list_next(value); } if (keys) { g_list_free(keys); } if (values) { g_list_free(values); } } } else if (JSON_NODE_TYPE(root) == JSON_NODE_ARRAY) { JsonArray* array = json_node_get_array(root); guint array_size = json_array_get_length (array); JsonNode *array_element; for (i = 0; i < array_size; i++) { array_element = json_array_get_element(array, i); clr_oci_json_parse_aux(array_element, node, true); } } else if (JSON_NODE_TYPE(root) == JSON_NODE_VALUE) { node = g_node_append(node, g_node_new(clr_oci_json_string(root))); if (parsing_array) { node = g_node_append(node, g_node_new(NULL)); } } }
static void _got_trending_topic_updates_cb (RestProxyCall *call, const GError *error_in, GObject *weak_object, gpointer userdata) { SwTwitterItemViewPrivate *priv = GET_PRIVATE (weak_object); SwItemView *item_view = SW_ITEM_VIEW (weak_object); SwSet *set; JsonParser *parser; JsonObject *root_o; SwService *service; GError *error = NULL; if (error_in) { g_warning (G_STRLOC ": Error getting trending topic data: %s", error_in->message); return; } service = sw_item_view_get_service (SW_ITEM_VIEW (item_view)); set = sw_item_set_new (); parser = json_parser_new (); if (!json_parser_load_from_data (parser, rest_proxy_call_get_payload (call), rest_proxy_call_get_payload_length (call), &error)) { g_warning (G_STRLOC ": error parsing json: %s", error->message); } else { JsonNode *root_n; JsonObject *trends_o; JsonArray *trends_a; GList *values; gint i; root_n = json_parser_get_root (parser); root_o = json_node_get_object (root_n); trends_o = json_object_get_object_member (root_o, "trends"); /* We have to assume just the one object member */ if (json_object_get_size (trends_o) == 1) { values = json_object_get_values (trends_o); trends_a = json_node_get_array ((JsonNode *)(values->data)); for (i = 0; i < json_array_get_length (trends_a); i++) { JsonObject *trend_o; SwItem *item; item = sw_item_new (); sw_item_set_service (item, service); trend_o = json_array_get_object_element (trends_a, i); sw_item_take (item, "date", sw_time_t_to_string (time(NULL))); sw_item_put (item, "id", json_object_get_string_member (trend_o, "name")); sw_item_put (item, "content", json_object_get_string_member (trend_o, "name")); sw_set_add (set, (GObject *)item); g_object_unref (item); } g_list_free (values); } } sw_item_view_set_from_set (SW_ITEM_VIEW (item_view), set); /* Save the results of this set to the cache */ sw_cache_save (service, priv->query, priv->params, set); sw_set_unref (set); g_object_unref (parser); }