我想解析.txt
文件中包含的JSON结构数据。我正确安装了FSharp.Data
库,并设置了路径(我还在学习相对路径)。即使如此,它也会引发一个我无法解释的错误。
#r "C:/Users/mauri/OneDrive/Programmazione1/Sharpstone/dataAccessManipulation/
packages/FSharp.Data.2.3.2/lib/net40/FSharp.Data.dll";;
open FSharp.Data
open FSharp.Data.JsonExtensions
let value = JsonValue.Load("C:/Users/mauri/OneDrive/Programmazione1/Sharpstone/SharpStone/Deck1")
将简单操作视为打印标记collection
for col in value?collectible do
printfn "%s" (col.AsString())
System.Exception: Not an object
此操作适用于较小的数据,例如来自tutorial的数据。不幸的是,我仍然无法在更大的数据库上工作(因为它很重要,请在我的GitHub account上找到它)。这种错误的原因是什么,以及"不是对象"意思?
答案 0 :(得分:3)
错误消息"不是对象"意味着您正在尝试访问不是对象(带有字段)的JSON节点的属性,而是访问其他内容 - 例如集合。
使用GitHub中的示例套牌,我认为value
代表一个集合,所以写value?collectible
会给你这个错误 - 因为你试图访问某个属性collectible
这是一个集合。
以下(打印所有艺术家姓名)应该有效:
let value = JsonValue.Load("https://raw.githubusercontent.com/Maurizio-Mario/Sharpstone/master/SharpStone/deck1.txt")
for col in value.AsArray() do
if col?collectible.AsBoolean() then
printfn "%s" (col?artist.AsString())
也就是说,使用JSON类型提供程序要容易得多,它从样本中推断出JSON文档的类型,然后以类型安全的方式公开所有属性:
type Deck = JsonProvider<"https://raw.githubusercontent.com/Maurizio-Mario/Sharpstone/master/SharpStone/deck1.txt">
let value = Deck.GetSamples()
for col in value do
if col.Collectible then
printfn "%s" col.Artist