bool CJSONVariantWriter::InternalWrite(yajl_gen g, const CVariant &value) { bool success = false; switch (value.type()) { case CVariant::VariantTypeInteger: success = yajl_gen_status_ok == yajl_gen_integer(g, (long long int)value.asInteger()); break; case CVariant::VariantTypeUnsignedInteger: success = yajl_gen_status_ok == yajl_gen_integer(g, (long long int)value.asUnsignedInteger()); break; case CVariant::VariantTypeDouble: success = yajl_gen_status_ok == yajl_gen_double(g, value.asDouble()); break; case CVariant::VariantTypeBoolean: success = yajl_gen_status_ok == yajl_gen_bool(g, value.asBoolean() ? 1 : 0); break; case CVariant::VariantTypeString: success = yajl_gen_status_ok == yajl_gen_string(g, (const unsigned char*)value.c_str(), (size_t)value.size()); break; case CVariant::VariantTypeArray: success = yajl_gen_status_ok == yajl_gen_array_open(g); for (CVariant::const_iterator_array itr = value.begin_array(); itr != value.end_array() && success; ++itr) success &= InternalWrite(g, *itr); if (success) success = yajl_gen_status_ok == yajl_gen_array_close(g); break; case CVariant::VariantTypeObject: success = yajl_gen_status_ok == yajl_gen_map_open(g); for (CVariant::const_iterator_map itr = value.begin_map(); itr != value.end_map() && success; ++itr) { success &= yajl_gen_status_ok == yajl_gen_string(g, (const unsigned char*)itr->first.c_str(), (size_t)itr->first.length()); if (success) success &= InternalWrite(g, itr->second); } if (success) success &= yajl_gen_status_ok == yajl_gen_map_close(g); break; case CVariant::VariantTypeConstNull: case CVariant::VariantTypeNull: default: success = yajl_gen_status_ok == yajl_gen_null(g); break; } return success; }