gpt4 book ai didi

f# - 从 F# 调用 Newtonsoft.Json 的意外结果

转载 作者:行者123 更新时间:2023-12-05 00:35:00 25 4
gpt4 key购买 nike

我没有从这个 F# 代码中得到预期的结果。由于调用 JsonSchema.Parse(json),我希望 t 包含值,但它是空的。我做错了什么?

open Newtonsoft.Json
open Newtonsoft.Json.Schema

let json = """{
"Name": "Bad Boys",
"ReleaseDate": "1995-4-7T00:00:00",
"Genres": [
"Action",
"Comedy"
]
}"""

[<EntryPoint>]
let main argv =
let t = JsonSchema.Parse(json)
0 // return an integer exit code

最佳答案

正如 John Palmer 指出的那样,JsonSchema.Parse 解析一个 JSON schema,但是从您的问题来看,您似乎想要解析一个普通的 JSON 。这可以通过 JsonConvert.DeserializeObject 实现:

let t = JsonConvert.DeserializeObject json

但是,DeserializeObject 的签名是返回 obj,因此这并不能特别帮助您访问这些值。为此,您必须将返回值转换为 JObject:

let t = (JsonConvert.DeserializeObject json) :?> Newtonsoft.Json.Linq.JObject
let name = t.Value<string> "Name"

Json.NET 旨在利用 C# 的 dynamic 关键字,但 F# 中并未内置完全等效的关键字。但是,您可以通过 FSharp.Dynamic 获得类似的语法。 :

open EkonBenefits.FSharp.Dynamic

let t = JsonConvert.DeserializeObject json
let name = t?Name

请注意 Name 之前的 ?。请记住,JSON 区分大小写。

现在,name 仍然不是一个字符串,而是一个JValue 对象,但是您可以通过调用 ToString(),但您也可以使用 JValueValue 属性,如果值是数字而不是字符串:

let jsonWithNumber = """{ "number" : 42 }"""
let t = JsonConvert.DeserializeObject jsonWithNumber
let actual = t?number?Value
Assert.Equal(42L, actual)

关于f# - 从 F# 调用 Newtonsoft.Json 的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com