在Python中处理JSON.Net JArray?

时间:2016-10-27 10:53:18

标签: c# python-2.7 json.net ironpython

我在我的C#应用​​程序中使用IronPython作为脚本语言。其中一个功能"我实现的是脚本持久保存值的能力,然后将其暴露给正在执行的下一个脚本。这是通过将要存储的值传递给C#类来实现的,该类由" host"暴露给脚本。应用。存储值的代码如下所示:

store.set("xyz", 123)

(' store'是C#对象公开的变量)。

C#类在内部将这些名称/值对存储在Dictionary<string, object>中。当脚本完成执行时,它使用Json.Net(var json = JsonConvert.SerializeObject(dict))序列化字典,并将结果字符串写入文件。

当下一个脚本运行时,&#34;主机&#34; C#应用程序读取并反序列化文件(JsonConvert.DeserializeObject<Dictionary<string, object>>(s))并通过相同的C#类将名称/值对公开给脚本,脚本可以像这样访问:

my_var = store.get("xyz")

此功能在使用简单类型(如整数和浮点数)时运行良好,但我们的一位用户现在需要保留int列表。它以一种方式工作 - 列表被持久化并暴露给下一个Python脚本,但此时它现在是JArray类型(似乎与Json.Net有关)。这与Python代码(预期int s的列表)没有很好的协作。

我想最简单的解决方法是将此JArray转换为Python int列表。但是如何?

如果问题可以解决,那将是很好的。在C#类(cast?)中,以避免用户在脚本中进行此转换。但是,我不想将de /序列化过程更改为不再读取用户的程度&#39;现有数据文件。想法?

1 个答案:

答案 0 :(得分:0)

我找到了一个对脚本作者影响很小的解决方案。在我的C#代码中,在对文件进行反序列化之后,我会通过字典查找值为223523的项目,并将它们转换为数组:

JArray

然后像以前一样将这些数组暴露给Python脚本;因为它们是C#数组,脚本authoer必须转换为Python列表,这是微不足道的:

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[]>();
   }
}