2016-10-27 7 views
0

私はIronPythonをC#アプリケーションのスクリプト言語として使用しています。私が実装した "機能"の1つは、スクリプトが実行されている次のスクリプトに公開される値を保持する機能です。これは、格納される値を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やfloatなどの単純な型でうまくいきましたが、ユーザーのうちの1人がintのリストを保持する必要があります。それはファッションに作用します - リストは永続化され、次のPythonスクリプトにさらされますが、今の時点ではJArrayタイプです(これはJson.Netと関係があります)。これは、Pythonコード(これはintのリストを期待しています)とうまくやりません。

私は、この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")) 
関連する問題