【问题标题】:unpacking GVariant in javascript在 javascript 中解压 GVariant
【发布时间】:2012-11-24 01:45:52
【问题描述】:

我在 GSettings 中有一个存储为 a(ss) 类型的 GVariant 的数组,我想在 Cinnamon Applet 中使用它。我可以使用以下代码成功检索该值:

let schema = schema_source.lookup(SCHEMA_NAME, false);
let settings = new Gio.Settings({ settings_schema: schema });
let my_value = settings.get_value('myvalue');

但我无法打开它。据我所知,我可能需要使用GVariantIter 结构来解压它,但是文档有限,而且我在gjs API 中找不到正确的接口(如果确实存在的话)。有人知道怎么做吗?

谢谢!

编辑: 我的架构如下所示:

<key type="a(ss)" name="myvalue">
    <default>[]</default>
    <summary>an array of (string, string) tuples</summary>
    <description></description>
</key>

目前我正在使用外部JSON 文件来存储设置,但这并不是一个100% 令人满意的解决方案。我想我可以维护两个as-type 变量,并保持它们对齐,但必须有办法正确地做到这一点,对吧?

【问题讨论】:

    标签: javascript gobject gnome-3 gnome-shell-extensions gjs


    【解决方案1】:

    有点晚了,但my_value.unpack() 工作得很好。

    my_value.deep_unpack() 将递归解包数组及其元素。

    【讨论】:

    • 为我工作! ——请问您是从哪里找到这条信息的?在official docs 中找不到名为unpack() 的方法。
    【解决方案2】:

    根据您的设置类型,我猜您想存储/检索字符串数组?在这种情况下,使用Gio.Settings.get_strv(String key) 有一个更简单的方法:

    // Read the array (will create a real JS array):
    let string_array = settings.get_strv("myvalue");
    // Now do something with it...
    // Store it:
    settings.set_strv("myvalue", string_array);
    Gio.Settings.sync(); // Important!
    

    在您的架构中,您将包含这样的条目:

    <key name="myvalue" type="as">
      <default>[]</default>
      <summary>Some array.</summary>
      <description>An Array of strings.</description>
    </key>
    

    我在我的扩展中使用了相同的技术:Read/Write | Schema

    【讨论】:

    • 感谢您的回答。不幸的是,我需要存储一个 pairs 字符串数组,因此是a(ss),因此是问题所在。我已经更新了我的问题。
    猜你喜欢
    • 2013-10-02
    • 2015-06-07
    • 2014-10-30
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多