如何用F#反序列化Json?

时间:2013-04-29 19:14:37

标签: 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)

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

type meta = {
   count: int
}

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

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

2 个答案:

答案 0 :(得分:5)

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

让它运行良好
let testjson = "{ 'count' : 15 }"

[根据评论更新]

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

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

答案 1 :(得分:3)

使用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库的作者。