2013-04-02 5 views
1

JSON 배열로 저장된 파일에서 일부 데이터를 읽어야합니다. 기본적으로 데이터는 노드의 레이블이있는 이진 트리와 리프의 값을 나타내고 양식화 된 선은 다음과 같습니다.F # 배열 배열 역 직렬화

[label1, [label3, w], x], [label4, y] ]

모든 지점에서 임의의 깊이 수준을 유지합니다. 이제 궁극적으로 내가 트리 구조로이 변환 찾고 있어요,하지만 첫 번째 단계는 그것을 읽고

다음 C# 코드합니다 (System.Web.Extensions.dll 사용) 작동합니다.

var jss = new JavaScriptSerializer(); 
foreach (string line in System.IO.File.ReadAllLines(filename)) 
{ 
    var data = jss.Deserialize<object[]>(line); 
} 

"작품"은 위의 예에서 데이터를 의미합니다. [1] 다시 개체의 배열입니다. F #에 대한 직접 포트는

let data = 
    let jss = new JavaScriptSerializer() 
    System.IO.File.ReadAllLines(filename) 
     |> Seq.map (fun line -> jss.Deserialize<obj[]>(line)) 

입니다. 그러나 예제에 적용하면 데이터가됩니다. [1] 객체 배열이 아니라 객체입니다. LABEL1이 문자열이고 (분명히)은 []으로 System.Object로 변환 할 수 없습니다

나는

 |> Seq.map (fun line -> jss.Deserialize<seq<obj[]>(line)) 

하여 직렬화를 교체 고려하지만 (내 예제에서)와 같은 작동하지 않습니다. 정적 클래스에서 C# 코드를 래핑하려고 시도한 다음이 클래스를 사용하여 F #의 데이터를 읽었지만 작동하지 않습니다. 외부 JSON 파서를 사용할 수는 있지만 JavaScriptSerializer를 사용하면 C#에서 작동하므로 내 stubborness가 시작되고 F #에서도이 작업을 수행하고 싶습니다. 어떤 제안?

+0

어쩌면 당신은 이것을 구현하기 위해 [JSON Type Provider] (http://fsharp.github.com/FSharp.Data/library/JsonProvider.html)를 사용할 수 있습니까? –

답변

3

이 나를 위해 작동합니다

#r "System.Web.Extensions" 

open System.Web.Script.Serialization 

let jss = new JavaScriptSerializer() 
let data = jss.Deserialize<obj[]>("""["label1",["label2",["label3","w"],"x"],["label4","y","z"]]""") 
let doesItWork = data.[1].GetType() = typeof<obj[]> 

당신은 당신을 위해 작동하지 않습니다 무엇보다 완전한 예를 제공 할 수 있을까요?

+0

지금 액세스 할 수있는 PC는 F # 3.0을 지원하지 않으므로 트리플 인용 문자열이 작동하지 않습니다. 그러나, 나를 위해'data. [1] .GetType() = typeof '도 true를 반환하지만 동시에'(data. [1]). [0]'과 같이 동작하지 않는다. 데이터 [1] :?> obj []). [0]'않습니다. 데이터 검색의 남은 부분을 캐스팅 할 것입니다. 그러나 동작 대 C#의 차이점을 이해하고 있는지는 확실하지 않습니다. – Bram

+0

@ Bram - 나는 C# 코드가 해당 캐스트를 필요로하지 않는다는 것에 놀랐다. (당신이 어딘가에'dynamic'을 사용하지 않는다면). – kvb

+0

어디서나 C# 코드에 "동적"을 사용하지 않았습니다. 어쨌든, 제가 일하고 싶었던 것은 지금 일하고 있습니다. 나는 그 차이를 일으키고있는 것을 추구하지 않을 것입니다. 두 가지를 비교하기에는 너무 적은 시간과 MSIL에 대한 지식이 너무 적습니다. 당신의 도움을 주셔서 감사합니다. – Bram