意想不到的结果从呼叫Newtonsoft.来自f#的Json



我没有从这个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()来获得字符串值,但是您也可以使用JValueValue属性,如果值是数字而不是字符串,则可以方便:

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

我建议使用Json类型提供程序。

相关内容

  • 没有找到相关文章

最新更新