如何用F#反序列化Json?

Ono*_*cci 7 f# json.net

我试图用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)
Run Code Online (Sandbox Code Playgroud)

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

type meta = {
   count: int
}
Run Code Online (Sandbox Code Playgroud)

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

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

vla*_*mir 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
Run Code Online (Sandbox Code Playgroud)

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


pbl*_*cci 6

尝试从JSON中删除最外层的花括号.现在,您有一个包含实例的对象meta.这可能会抛弃JSON.NET.换句话说,我通过使用以下方式运行良好:

let testjson = "{ 'count' : 15 }"
Run Code Online (Sandbox Code Playgroud)

[更新评论基础]

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

type Foo =
  { meta : Meta }
and Meta =
  { count : int }
Run Code Online (Sandbox Code Playgroud)