如何使用F#反序列化Json?
我正试图用Newtonsoft.json 5.0.4将一些非常简单的json反序列化为F#:如何使用F#反序列化Json?,f#,json.net,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
#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)
我改为使用Automatic属性,因为我认为Newtonsoft.Json可能无法正确构造对象
如果我的F#/Windows版本在这种情况下有所不同,我会感到惊讶,但这仅仅是为了完整性:我正在用F#3.0 Repl(11.0.60315.1)进行尝试,而我运行的是Win7 x64(SP1)设备 尝试从JSON中删除最外层的一组大括号。现在,您有一个包含
meta
实例的对象。这可能是在抛弃JSON.NET。换句话说,我通过使用以下工具使其运行良好:
let testjson = "{ 'count' : 15 }"
[根据评论更新]
或者,您可以保持JSON的原样,并在F#中提供更复杂的类型树。例如:
type Foo =
{ meta : Meta }
and Meta =
{ count : int }
有了这个库,您可以只使用记录类型——不再需要定义类了。以上提供的记录结构刚好足够:
type Foo =
{ meta : Meta }
and Meta =
{ count : int }
let testjson = """{"meta": {"count": 15}}"""
open FSharp.Json
let data = Json.deserialize<Foo> testjson
输入Foo=
{meta:meta}
和元=
{count:int}
让testjson=“{”meta:{“count”:15}}”“”
打开FSharp.Json
让data=Json.deserializetestjson
披露:我是FSharp.Json库的作者。您考虑过使用F#Json类型提供程序吗@如果mono支持类型提供程序,那就好了。我希望它也能在mono上运行。这是一个很好的建议,但实际的json将包含外部名称,所以我也需要弄清楚如何反序列化它。我对问题的性质感到困惑;正如您所说的,如果json的格式发生变化,它会很好地进行反序列化,因此它似乎不是一个F#问题。那么,您所需要做的就是定义另一个具有
meta
作为成员的类型。然后反序列化为该类型。类似于typefoo={meta:meta}和meta={count:int}
。我想知道这是否与记录类型的F#type推断机制有关。当然,如果是这样的话,你会认为另一种方法(自动成员)可以工作。这只是F#所看到的类型层次结构与JSON中编码的类型层次结构之间的不匹配。毕竟,JSON中的每个{
..}
对都是另一个对象(在类型实例意义上)。
type Foo =
{ meta : Meta }
and Meta =
{ count : int }
let testjson = """{"meta": {"count": 15}}"""
open FSharp.Json
let data = Json.deserialize<Foo> testjson