DataContract/JsonSerializer'@'附加到变量名称

aka*_*nom 3 .net c# f# json datacontract

由于某些原因,我序列化一个类型(f#):

type JsonKeyValuePair<'T, 'S> =  {
    [<DataMember>] 
    mutable key : 'T
    [<DataMember>] 
    mutable value : 'S
}

let printJson() = 

    use stream = new MemoryStream() 
    use reader = new System.IO.StreamReader(stream)

    let o = {key = "a"; value = 1 }
    let jsonSerializer = Json.DataContractJsonSerializer(typeof<TestGrounds.JsonKeyValuePair<string, int>>)

    jsonSerializer.WriteObject (stream , o)
    stream.Seek(int64 0, SeekOrigin.Begin) |> ignore 

    printfn <| Printf.TextWriterFormat<unit>(reader.ReadToEnd())
    ()
Run Code Online (Sandbox Code Playgroud)

它生成一个字符串:

{ "键@": "一", "值@":1}

如果我尝试在没有@符号的情况下反序列化它:

let deserialize() = 
    let json = "{\"key\":\"b\",\"value\":2}"
    let o  = deserializeString<TestGrounds.JsonKeyValuePair<string, int>> json
    ()
Run Code Online (Sandbox Code Playgroud)

{"数据协定类型'TestGrounds.JsonKeyValuePair`2 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.Int32,mscorlib,Version = 4.0.0.0,Culture =中性,PublicKeyToken = b77a5c561934e089]]'无法反序列化,因为找不到所需的数据成员'key @,value @'."}

然而把@重新放入:

let run2 () = 
    let json = "{\"key@\":\"b\",\"value@\":2}"
    let o  = deserializeString<TestGrounds.JsonKeyValuePair<string, int>> json
    ()
Run Code Online (Sandbox Code Playgroud)

我们都很好.到目前为止,我知道在Json Spec(http://www.json.org/)中没有提及@ ...

kvb*_*kvb 5

F#生成调用的字段key@value@支持调用的属性keyvalue.尝试DataContract在您的记录类型上添加一个属性 - 如果没有它,序列化程序将忽略这些DataMember属性并且似乎只写出每个字段.