2016-10-27 3 views
0

Я использую IronPython в качестве языка сценариев в своем приложении C#. Одна из «функций», которые я реализовал, - это способность сценария сохранять значения, которые затем подвергаются выполнению следующего скрипта. Это достигается путем передачи значений (значений), которые должны быть сохранены в класс C#, который подвергается скрипту приложением «хозяин». Код для хранения значения выглядит примерно так:Работа с JSON.Net JArray в Python?

store.set("xyz", 123) 

(«магазин» является переменной, через которую объект C# подвергается).

Внутренний класс C# хранит эти пары имя/значение в Dictionary<string, object>. Когда скрипт заканчивает выполнение, он сериализует словарь с помощью Json.Net (var json = JsonConvert.SerializeObject(dict)) и записывает результирующую строку в файл.

Когда следующий скрипт запускается, «хост» C# приложение считывает и deserialises файл (JsonConvert.DeserializeObject<Dictionary<string, object>>(s)) и выставляет пары имя/значение в скрипте через тот же C# класс, который сценарий может получить доступ к следующим образом:

my_var = store.get("xyz") 

Эта функция работает нормально с простыми типами, такими как Интс и поплавков, но один из наших пользователей в настоящее время требуется сохранять список int с. Он работает в моде - список сохраняется и отображается на следующем скрипте Python, но на данный момент это теперь тип JArray (что-то похожее на Json.Net). Это не очень хорошо сочетается с кодом Python (который ожидает список int s).

Я думаю, что самое простое исправление заключается в преобразовании этого JArray в список Python int. Но как?

В качестве альтернативы было бы неплохо, если бы проблема могла быть «исправлена» в классе C# (кастинг?), Чтобы пользователи не могли делать это преобразование в своих сценариях. Однако я не хочу изменять процесс де-сериализации в той мере, в какой он больше не читает существующие файлы данных пользователей. Мысли?

+0

вы могли бы привести пример того, что желаемый результат будет и то, что вы в настоящее время есть (JSON) – nozzleman

ответ

0

Я нашел решение с минимальным влиянием на авторов сценариев. В моем C# код, после того, как deserialising файл, я иду по словарю искать предметы со значением типа JArray, и преобразовывать их в массивы:

var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json); 

var keys = dict.Keys.ToList(); 
foreach (var key in keys) 
{ 
    var jarray = dict[key] as JArray; 
    if (jarray != null) 
    { 
     dict[key] = jarray.ToObject<object[]>(); 
    } 
} 

Эти массивы затем подвергаются сценарию Python, как и раньше; так как они являются C# Массивы authoer скрипт должен преобразовать в списки Python, который является тривиальным:

my_var = list(store.get("xyz")) 
Смежные вопросы