使用Json.NET将F#可变变量序列化为JSON会生成重复项

时间:2014-01-07 21:29:34

标签: json serialization f# json.net

这是我的代码:

 open Newtonsoft.Json
 open Newtonsoft.Json.Converters

 type T = {
     mutable name : string;
     mutable height : int;
     }

 let a = { name = "abc"; height = 180;}
 a.height  <- 200
 let b = JsonConvert.SerializeObject(a, Formatting.Indented)
 printfn "%s"  b

代码的输出是:

{
  "name@": "abc",
  "height@": 200,
  "name": "abc",
  "height": 200
}

如何以正确的“@”来避免输出?

4 个答案:

答案 0 :(得分:3)

试试这个:

[<CLIMutable>]
[<JsonObject(MemberSerialization=MemberSerialization.OptOut)>]
type T = {
    name : string;
    height : int;
    }

MemberSerialization.OptOut仅导致公共成员被序列化(跳过作为记录的实现细节的私有字段)。 CLIMutable属性为intended specifically for serialization,并且不必为每位成员添加mutable前缀。

答案 1 :(得分:1)

您是否尝试在属性前添加属性[&lt; ...&gt;]?因为该属性仅适用于属性,而不适用于生成的后端。但是,不确定JSON.NET对哪个属性作出反应。

答案 2 :(得分:1)

DataMemberAttribute的帮助下,您可以指定序列化成员的名称:

type T = {
    [<field: DataMember(Name="name")>]
    mutable name : string;
    [<field: DataMember(Name="height")>]
    mutable height : int;
}

答案 3 :(得分:0)

我遇到了同样的问题,在经过Json.Net docs的大量挖掘后,我不得不最终看到这是有用的。

 open System
 open System.Runtime.Serialization

 [<CLIMutable>]
 [<DataContract>]
 type T = {
    [<DataMember>] mutable name : string;
    [<DataMember>] mutable height : int }