Parsing Glib词典条目管理

Parsing Glib词典条目管理,parsing,hashtable,glib,Parsing,Hashtable,Glib,我正在处理一个dbus响应,如下所示: struct { object path "/object/path" array [ dict entry( string "A" variant string "a" ) dict entry( string "B" variant

我正在处理一个dbus响应,如下所示:

 struct {
     object path "/object/path"
     array [
        dict entry(
           string "A"
           variant                   string "a"
        )
        dict entry(
           string "B"
           variant                   array [
                 string "none"
              ]
        )
        dict entry(
           string "C"
           variant                   string "c"
        )
  ]
}

我正在使用glib版本2.4我需要解析上面的结构。为了创建一个GHashTable,我几乎尝试了一切,但没有成功。 你能帮我做这个吗


提前感谢

在程序中添加此解析器函数:

要传递给解析器函数的参数有:

第一:字典-a{sv}

第二:映射引用-因此无需在堆栈上创建映射变量

void recursive_parser(GVariant *arg_config, map<string, void *> &vec)
{
  GVariantIter iter;
  GVariant *child;
  gchar *key;

 g_variant_iter_init (&iter, arg_config);
 while (g_variant_iter_next (&iter, "{sv}", &key, &child))
 {
    if(g_variant_is_container(child))
    {
      recursive_parser(child, vec);
    }
    else
    {
      if(g_variant_type_equal(g_variant_get_type(child),G_VARIANT_TYPE_STRING))
      {
         gchar *val = g_variant_get_string(child,NULL);
         vec.insert(make_pair<string,void*>(key,val)); 
      }
      if(g_variant_type_equal(g_variant_get_type(child),G_VARIANT_TYPE_INT32))
      {
         gint32 *val = g_variant_get_int32(child);
         vec.insert(make_pair<string,void*>(key,val)); 
      }
    }
 }


}
void递归解析器(GVariant*arg\u配置、map和vec)
{
GVariantIter-iter;
GVariant*儿童;
gchar*键;
g_变体_iter_init(&iter,arg_config);
while(g_variant_iter_next(&iter,{sv},&key,&child))
{
if(g_变体_是_容器(子))
{
递归_解析器(child,vec);
}
其他的
{
if(g_variant_type_equal(g_variant_get_type(child),g_variant_type_STRING))
{
gchar*val=g_variant_get_string(child,NULL);
向量插入(配对(键,值));
}
if(g_variant_type_equal(g_variant_get_type(child),g_variant_type_INT32))
{
gint32*val=g_variant_get_int32(child);
向量插入(配对(键,值));
}
}
}
}

这段代码甚至适用于glib版本<2.4:-)

glib永远都有一个哈希表,所以这可能不是您的问题。。。但2.3是在2003年发布的,当时大概是石器时代:如果我没记错的话,当时D-Bus还没有作为一个实际的实现存在——GLib肯定没有与之集成。您可能正在使用dbusglib(一个独立于glib的库)。。。但假设它也有十年的历史:你不能指望有人为古老的、已经不推荐使用的库编写示例代码。如果你需要帮助,你必须展示你的工作:你尝试了什么,什么有效,什么无效。嗨,谢谢你的回复。基本上,我已经使用gdbus codegen为使用DBus的服务生成了客户机代码。然后我调用了代理来调用一个方法,得到了GVariant*中包含的上述结构(通过dbus发送实现)。我需要解析这样的响应,以便将各个字段放入我自己的对象中。。。原始帖子中的油嘴滑舌的版本是打字错误?实际上不是。我用的是2.38。嘿,2.4比2.38大十年。如果你在帖子中修改了版本号,这个问题就变得更有意义了(你仍然应该展示你的作品,但至少人们不会认为“那不可能是正确的”)而通过它。