2012-12-06 63 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