2012-12-06 60 views
0

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

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类型的变量,并保持它们的一致性,但必须有一种方法来正确地做到这一点,对吧?

回答

2

有点晚,但my_value.unpack()工作绝对好。

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

+0

谢谢你 - 我会尽快检查出来并回复你:) – simon

+0

适合我! - 请问你在哪里找到这条信息?在[官方文档](https://developer.gnome.org/glib/stable/glib-GVariant.html)中我找不到一个名为'unpack()'的方法。 – JayStrictor

0

从你的设置类型我猜你想要存储/检索一个字符串数组?在这种情况下,存在使用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

+0

感谢您的回答。不幸的是,我需要存储一串_pairs_的字符串,因此'a(ss)',因此就是问题所在。我已经更新了我的问题。 – simon