1

JSON 配列として保存されているファイルからデータを読み込む必要があります。基本的に、データはノードのラベルと葉の値を持つ二分木を表し、線は次のように定型化されます。

[ラベル1,[ラベル2,[ラベル3,w],x],[ラベル4,y,z]]

すべての枝に任意のレベルの深さがあります。最終的にはこれをツリー構造に変換しようとしていますが、最初のステップはそれを読み込むことです。

次の C# コードは機能します (System.Web.Extensions.dll を使用)。

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

「作品」とは、上記の例では data.[1] を意味します。再びオブジェクトの配列です。F# への直接移植は

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

ただし、これを例に適用すると、データが得られます[1]。オブジェクトの配列ではなく、オブジェクトであること。

逆シリアル化を次のように置き換えることを検討しました

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

しかし、(私の例では) label1 は文字列であり、(明らかに) System.Object[] に変換できないため、それは機能しません。また、C# コードを静的クラスにラップしてから、このクラスを使用して F# のデータを読み込もうとしましたが、それもうまくいきません。外部の JSON パーサーを使用できることはわかっていますが、JavaScriptSerializer を使用すると C# で機能するため、私の頑固さが始まり、F# でもこの方法でこれを行いたいと考えています。助言がありますか?

4

1 に答える 1

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[]>

あなたにとってうまくいかないことのより完全な例を提供できますか?

于 2013-04-02T15:15:17.873 に答える