首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解析"a(oa{sv})“dbus类型?

如何解析"a(oa{sv})“dbus类型?
EN

Stack Overflow用户
提问于 2017-09-28 11:52:14
回答 1查看 2.6K关注 0票数 0

我正在解析对"net.connman.Manager.GetServices“函数的响应,该函数如下所示:

代码语言:javascript
复制
<method name="GetServices">
    <arg name="services" type="a(oa{sv})" direction="out"/>
</method>

这是相当复杂的结构。

到目前为止我得到的是:

代码语言:javascript
复制
GVariant* result = ... // response containing data
GVariantIter* iter1;
g_variant_get( result, "a(oa{sv})", &iter1 );

GVariant* child = g_variant_iter_next_value( iter1 );
while ( nullptr != child )
{
    gchar* string;
    GVariant* data;
    g_variant_get( child, "(oa{sv})", &string, &data );

    // how to access inner array?

    g_variant_unref( child );
    child = g_variant_iter_next_value( iter1 );
}

g_variant_iter_free( iter1 );

那么,如何访问内部数组数据呢?

我尝试过: GVariantIter* iter2;g_variant_get( data,"a{sv}",&iter2 );GVariant* child2 = g_variant_iter_next_value( iter2 );

但是它失败了,出现了一些对齐错误:

代码语言:javascript
复制
**
GLib:ERROR:../../glib-2.48.2/glib/gvarianttypeinfo.c:163:g_variant_type_info_check: assertion failed: (info->alignment == 0 || info->alignment == 1 || info->alignment == 3 || info->alignment == 7)
Aborted
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-30 21:11:00

按照data的文档,GVariantIter*应该是GVariantIter*类型,而不是GVariant*类型(您将GVariant格式字符串作为第二个参数传递给g_variant_get())。

不过,您可以通过使用g_variant_iter_loop()来简化代码:

代码语言:javascript
复制
/* Compile with: `gcc `pkg-config --cflags --libs glib-2.0 gio-2.0` -o test test.c`.
 * Public domain. */

#include <glib.h>
#include <gio/gio.h>

int
main (void)
{
  g_autoptr(GVariant) result = g_variant_new_parsed ("@a(oa{sv}) [('/', { 'hello': <'test'>})]");

  g_autoptr(GVariantIter) iter1 = NULL;
  g_variant_get (result, "a(oa{sv})", &iter1);

  const gchar *string;
  g_autoptr(GVariantIter) iter2 = NULL;

  while (g_variant_iter_loop (iter1, "(&oa{sv})", &string, &iter2))
    {
      const gchar *key;
      g_autoptr(GVariant) value = NULL;

      while (g_variant_iter_loop (iter2, "{&sv}", &key, &value))
        g_message ("%s, %s:%p", string, key, value);
    }

  return 0;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46468448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档