распаковка GVariant в javascript

У меня есть массив, хранящийся как GVariant типа a(ss) в GSettings, который я хочу использовать в апплете Cinnamon. Я могу успешно получить значение, используя следующий код:

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 и поддерживать их выравнивание, но должен быть способ сделать это правильно, верно?


person simon    schedule 06.12.2012    source источник


Ответы (2)


Немного поздно, но my_value.unpack() работает абсолютно нормально.

my_value.deep_unpack() будет рекурсивно распаковывать массивы и их элементы.

person Community    schedule 11.08.2013
comment
спасибо за это - я проверю это, как только у меня будет время, и вернусь к вам :) - person simon; 14.08.2013
comment
Работает на меня! -- Могу я спросить, где вы нашли эту информацию? В официальной документации я не могу найти метод с именем unpack(). - person JayStrictor; 09.03.2016

Судя по вашему типу настроек, я думаю, вы хотите сохранить/получить массив строк? В этом случае есть более простой метод с использованием 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>

Я использую ту же технику в своем расширении: Чтение/запись | Схема

person Lukas Knuth    schedule 15.12.2012
comment
спасибо за Ваш ответ. к сожалению, мне нужно хранить массив пар строк, следовательно, a(ss) и, следовательно, проблема. я немного обновил свой вопрос. - person simon; 15.12.2012