JSONNODE *ImgTagJson::genLitXmp(const Exiv2::Image::AutoPtr & image) { Exiv2::XmpData &data = image->xmpData(); data.sortByKey(); if (data.empty()) return NULL; Exiv2::XmpData::const_iterator end = data.end(); JMAP *grpmap = new JMAP(); JSONNODE *tree = json_new(JSON_NODE); for (Exiv2::XmpData::const_iterator i = data.begin(); i != end; ++i) { JSONNODE *grp; if (grpmap->find(i->groupName()) == grpmap->end()) { grp = json_new(JSON_NODE); json_set_name(grp, i->groupName().c_str()); grpmap->insert(JMAP::value_type(i->groupName(), grp)); } else grp = (grpmap->find(i->groupName()))->second; Exiv2::XmpData::const_iterator nxt = i + 1; if ((nxt != data.end()) && (i->key() == nxt->key())) { //cout << "Array Elem! " << i->key() << endl; JSONNODE *arr = json_new(JSON_ARRAY); json_set_name(arr, i->tagName().c_str()); json_push_back(arr, json_new_a((i->tagName()).c_str(), (i->print()).c_str())); while ((nxt != data.end()) && (nxt->key() == i->key())) { json_push_back(arr, json_new_a((nxt->tagName()).c_str(), (nxt->print()).c_str())); nxt++; } json_push_back(grp, arr); if (nxt == data.end()) break; i = nxt - 1; } else { json_push_back(grp, json_new_a((i->tagName()).c_str(), (i->print()).c_str())); } //cout << json_write_formatted(grp) << endl; } JMAP::iterator it; for(it = grpmap->begin(); it != grpmap->end(); it++) { json_push_back(tree, it->second); grpmap->erase(it); } //cout << it->first << endl; delete grpmap; //cout << json_write_formatted(tree) << endl; json_set_name(tree, "xmp"); return tree; }