来自F#的Newtonsoft.Json调用的意外结果

时间:2014-03-17 04:20:57

标签: f# json.net

我没有从这个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

2 个答案:

答案 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类型的提供程序。