在JavaScript拆包GVariant(unpacking GVariant in javasc

2019-10-29 05:21发布

我已经存储为类型的GVariant阵列a(ss)在GSettings,我想在一个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型变量,并保持一致,但必须有办法妥善做到这一点,对不对?

Answer 1:

有点晚了,但my_value.unpack()的作品精绝。

my_value.deep_unpack()将递归解包阵列和它们的元素。



Answer 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>

我用同样的方法在我的分机: 读/写 | 架构



文章来源: unpacking GVariant in javascript