从 F# 调用 Newtonsoft.Json 出现意外结果

2024-05-15

我没有从该 F#​​ 代码中获得预期结果。我希望 t 包含调用 JsonSchema.Parse(json) 的结果,但它是空的。我究竟做错了什么?

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

正如约翰·帕尔默指出的那样,JsonSchema.Parse解析 JSONschema,但从你的问题来看,你似乎想解析一个普通的 JSONvalue。这是可能的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 https://github.com/ekonbenefits/FSharp.Dynamic#fsharpdynamic--:

open EkonBenefits.FSharp.Dynamic

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

注意? before Name。请记住,JSON 区分大小写。

Now, name still 不是字符串,而是一个JValue对象,但您可以通过调用获取字符串值ToString()就可以了,但你也可以使用JValue's Value属性,如果值是数字而不是字符串,这会很方便:

let jsonWithNumber = """{ "number" : 42 }"""
let t = JsonConvert.DeserializeObject jsonWithNumber
let actual = t?number?Value
Assert.Equal(42L, actual)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 F# 调用 Newtonsoft.Json 出现意外结果 的相关文章

随机推荐