10

我正在尝试使用 Newtonsoft.Json 5.0.4 将一些非常简单的 json 反序列化为 F#:

#if INTERACTIVE
#r "C:/Users/OCatenacci/fshacks/CreateWeeklySWEEventsEmail/packages/Newtonsoft.Json.5.0.4/lib/net40/Newtonsoft.Json.dll"
#endif 

open System
open Newtonsoft.Json

type meta() = class
    member val count = 0 with get, set
    end

let testjson = """{
    "meta": {
        "count": 15
    }
}"""


let o = JsonConvert.DeserializeObject<meta>(testjson)

meta 在计数中总是得到 0。顺便说一句,我最初是这样定义元的:

type meta = {
   count: int
}

我改为使用 Automatic 属性,因为我认为 Newtonsoft.Json 可能无法正确构造对象。

如果我的 F#/Windows 版本在这种情况下有所不同,但只是为了完整起见,我会感到惊讶:我正在使用 F# 3.0 Repl (11.0.60315.1) 进行尝试,并且我在 Win7 x64 (SP1) 上运行) 盒子。

4

2 回答 2

9

尝试从 JSON 中删除最外面的一组花括号。现在,您有一个包含meta. 这可能会抛弃 JSON.NET。换句话说,我通过以下方式让它运行良好:

let testjson = "{ 'count' : 15 }"

[根据评论更新]

或者,您可以保持 JSON 原样,并在 F# 中提供更复杂的类型树。例如:

type Foo =
  { meta : Meta }
and Meta =
  { count : int }
于 2013-04-29T20:30:12.397 回答
9

使用FSharp.Json库,您可以只使用记录类型 - 不再需要定义类。上面提供的记录结构就足够了:

type Foo =
  { meta : Meta }
and Meta =
  { count : int }

let testjson = """{"meta": {"count": 15}}"""

open FSharp.Json
let data = Json.deserialize<Foo> testjson

披露:我是 FSharp.Json 库的作者。

于 2017-11-09T04:59:11.537 回答