2016-10-27 128 views
0

我在我的C#應用​​程序中使用IronPython作爲腳本語言。我實現的一個「特性」是腳本能夠保存值,然後將這些值暴露給正在執行的下一個腳本。這是通過將要存儲的值傳遞給「主機」應用程序暴露給腳本的C#類來實現的。存儲值的代碼如下所示:在Python中處理JSON.Net JArray?

store.set("xyz", 123) 

('store'是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的List。它工作得很時尚 - 列表被持久化並暴露給下一個Python腳本,但是現在它已成爲JArray類型(看起來與Json.Net有關)。這不能很好地與Python代碼(期望列表int s)很好地協作。

我想最簡單的修復方法是將此JArray轉換爲Python int列表。但是如何?

另外,如果問題可以在C#類中「固定」(鑄造?),以避免用戶必須在其腳本中執行此轉換,那將會很不錯。但是,我不想將de/serialization過程更改爲不再讀取用戶現有數據文件的程度。思考?

+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"))