在Json.NET中支持DU的F#

时间:2014-04-04 09:57:01

标签: f# json.net

我试图从Json.NET的官方网络博客中执行样本

http://james.newtonking.com/archive/2014/02/01/json-net-6-0-release-1-%E2%80%93-jsonpath-and-f-support

我使用最新的Json.NET(Json.NET 6.0.2)

创建了F#控制台应用程序

我粘贴了代码示例并将其采用到F#3.0:

type Shape =
    | Rectangle of float * float
    | Circle of float
    | Empty 

[<EntryPoint>]
let main argv =  

let shape1 = Rectangle(1.3, 10.0)
let json = JsonConvert.SerializeObject(shape1)
// {
//   "Case": "Rectangle",
//   "Fields": [
//     1.3,
//     10.0
//   ]
// }


let shape2 = JsonConvert.DeserializeObject<Shape>(json)

Console.ReadKey() |> ignore
0

但它不起作用。基本上JsonConvert.SerializeObject(shape1)返回“{}”。

我很好奇为什么它不起作用?

除此之外,我在F#WebAPI中使用Json.NET并且它可以工作。

我已经在github上传了整个项目: https://github.com/AntyaDev/SerializationTest

1 个答案:

答案 0 :(得分:2)

像PatrykĆwiek一样,我无法重现你描述的行为。它适用于F#3.1上的Json.NET 6.0.2。但是,您的代码清单存在一些问题,这些问题无法按照给定的方式进行编译。

您需要打开相应的命名空间(或模块):

open System
open Newtonsoft.Json

此外,F#使用了重要的空格,因此代码清单应该与原始博客类似:

type Shape =
    | Rectangle of width : float * length : float
    | Circle of radius : float
    | Empty 

[<EntryPoint>]
let main argv =  

    let shape1 = Rectangle(1.3, 10.0)
    let json = JsonConvert.SerializeObject(shape1)
    // {
    //   "Case": "Rectangle",
    //   "Fields": [
    //     1.3,
    //     10.0
    //   ]
    // }


    let shape2 = JsonConvert.DeserializeObject<Shape>(json)

    Console.ReadKey() |> ignore
    0

请注意, let main argv =下面的所有代码都是缩进的。