1

我必须从存储为 JSON 数组的文件中读取一些数据。基本上,数据代表一棵二叉树,带有节点标签和叶子上的值,并且风格化了一条线,如下所示:

[label1,[label2,[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);
}

对于“作品”,我的意思是在上面给出的示例中,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 回答