我没有从这个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
答案 0 :(得分:8)
正如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.Dynamic获得类似的语法:
open EkonBenefits.FSharp.Dynamic
let t = JsonConvert.DeserializeObject json
let name = t?Name
请注意?
之前的Name
。请记住,JSON区分大小写。
现在,name
仍然不是字符串,而是JValue
对象,但您可以通过调用ToString()
来获取字符串值,但你也可以使用JValue
的{{1}}属性,如果值是数字而不是字符串,这可能很方便:
Value
答案 1 :(得分:4)
我建议改用Json类型的提供程序。