对JSON结构化数据的操作

时间:2016-11-25 17:19:18

标签: json visual-studio f#

我想解析.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上找到它)。这种错误的原因是什么,以及"不是对象"意思?

1 个答案:

答案 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