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

标签 c# .net json f# 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())
    ()

它生成一个字符串:

{"key@":"a","value@":1}

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

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

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

但是把@放回去:

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

我们都很好。据我所知,在 Json 规范 ( http://www.json.org/ ) 中没有提到 @...

最佳答案

F# 生成名为 key@value@ 的字段以支持名为 keyvalue 的属性。尝试在您的记录类型上放置一个 DataContract 属性 - 没有它,序列化程序将忽略 DataMember 属性并且似乎只是写出每个字段。

关于c# - DataContract/JsonSerializer '@' 附加到变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207431/

相关文章:

C# - 带有 linq 参数的泛型方法

c# - 在对文字值进行相等比较时,操作数的顺序重要吗?

javascript - 解析 "deep"JSON

json - JQ递归树扩展

PHP | json_decode 巨大的 json 文件

c# - 序列化异常 : Type is not resolved for member "..."

c# - 如何为 Outlook 添加身份验证到 ASP.NET 托管的 ICS iCalendar

c# - MonoTouch 确定性处理单元

c# - 使用 c# 2010 express 连接到 oracle XE

c# - 从字节数组加载 WPF 图像控件