【问题标题】:Unexpected result from call to Newtonsoft.Json from F#从 F# 调用 Newtonsoft.Json 的意外结果
【发布时间】:2014-03-17 04:20:57
【问题描述】:

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

【问题讨论】:

  • 有效的 JSON 字符串需要双引号。请记住 JSON !== JavaScript。
  • 谢谢 ChaosPandon,我已修复并编辑了问题,但结果仍然为空。
  • 我认为问题在于 Jsonschemer.Parse 加载了一个模式,这不是您想要的 - 请参阅此处james.newtonking.com/json/help/index.html?topic=html/…

标签: f# json.net


【解决方案1】:

正如 John Palmer 指出的那样,JsonSchema.Parse 解析 JSON schema,但从您的问题来看,您似乎想要解析普通的 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() 来获取字符串值,但你也可以使用JValueValue 属性,如果值是数字而不是字符串,它会很方便:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 1970-01-01
      • 2016-10-06
      • 2016-05-30
      • 1970-01-01
      • 2011-09-15
      • 2012-04-02
      • 2019-05-14
      • 2017-07-11
      相关资源
      最近更新 更多