Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用F#反序列化Json?_F#_Json.net - Fatal编程技术网

如何使用F#反序列化Json?

如何使用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

我正试图用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)
我改为使用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