我试图用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)框。
答案 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库的作者。