【发布时间】:2013-04-02 14:54:37
【问题描述】:
我必须从存储为 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# 中这样做。有什么建议吗?
【问题讨论】:
-
也许你可以使用JSON Type Provider 来实现这个?
标签: arrays f# deserialization