F#反序列化数组数组

时间:2013-04-02 14:54:37

标签: arrays f# deserialization

我必须从存储为JSON Arrays的文件中读取一些数据。基本上,数据表示一个二叉树,其中包含叶子上的节点和值的标签,并且线条样式化如下:

[label1的,[标签2,[LABEL3,W],x]中,[label4,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);
}

对于“作品”,我的意思是在上面给出的例子中,数据。[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#这样做。有什么建议吗?

1 个答案:

答案 0 :(得分: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[]>

你能否提供一个更完整的例子来说明哪些不适合你呢?