我没有从这个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
正如John Palmer所指出的,JsonSchema.Parse
解析JSON 模式,但从您的问题来看,似乎您想解析一个正常的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获得类似的语法。动态:
open EkonBenefits.FSharp.Dynamic
let t = JsonConvert.DeserializeObject json
let name = t?Name
注意Name
之前的?
。请记住JSON是区分大小写的。
现在,name
仍然不是字符串,而是JValue
对象,但是您可以通过调用ToString()
来获得字符串值,但是您也可以使用JValue
的Value
属性,如果值是数字而不是字符串,则可以方便:
let jsonWithNumber = """{ "number" : 42 }"""
let t = JsonConvert.DeserializeObject jsonWithNumber
let actual = t?number?Value
Assert.Equal(42L, actual)
我建议使用Json类型提供程序。