2016-10-27 8 views
0

C# 응용 프로그램에서 IronPython을 스크립팅 언어로 사용하고 있습니다. 필자가 구현 한 "기능"중 하나는 스크립트가 값을 유지하고 다음 실행될 스크립트에 노출되는 기능입니다. 이것은 "호스트"응용 프로그램에 의해 스크립트에 노출 된 C# 클래스에 저장 될 값을 전달하여 수행됩니다.Python에서 JSON.Net JArray 다루기?

store.set("xyz", 123) 

('저장'는 C# 1 오브젝트가 노출되는 변수이다)의 값을 저장하는 코드는 다음과 같이 보인다.

내부적으로 C# 클래스는 이러한 이름/값 쌍을 Dictionary<string, object>에 저장합니다. 스크립트 실행이 끝나면 Json.Net (var json = JsonConvert.SerializeObject(dict))을 사용하여 사전을 serialize하고 결과 문자열을 file에 씁니다. 다음 스크립트를 실행하면

는 "호스트"C# 응용 프로그램 읽기 및 파일 (JsonConvert.DeserializeObject<Dictionary<string, object>>(s))을 deserialises하고 스크립트는 다음과 같이 액세스 할 수있는 같은 C# 클래스를 통해 스크립트의 이름/값 쌍을 노출 :

my_var = store.get("xyz") 

이 기능 등의 int와 수레와 같은 간단한 유형과 잘 작동하고있다, 그러나 우리의 사용자 중 한 지금 int의 목록을 지속 할 필요가있다. 그것은 유행에 작동합니다 -리스트는 계속 유지되어 다음 Python 스크립트에 노출됩니다. 그러나 지금은 JArray 타입입니다 (Json.Net과 관련이있는 것 같습니다). 이것은 파이썬 코드 (이것은 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[]>(); 
    } 
} 

이 배열은 다음 이전과 파이썬 스크립트에 노출됩니다; 그들은 C#을 배열 인으로 스크립트 authoer는 간단하다 파이썬 목록을 변환해야합니다

my_var = list(store.get("xyz"))