如何将 DataContractJsonSerializer 与泛型一起使用

How to use DataContractJsonSerializer with Generics

我在 Convert an object to json, and json to object 找到这个例子,在传递类型时将字符串反序列化为 JSON,反之亦然。

/// Object to Json 
let internal json<'t> (myObj:'t) =   
        use ms = new MemoryStream() 
        (new DataContractJsonSerializer(typeof<'t>)).WriteObject(ms, myObj) 
        Encoding.Default.GetString(ms.ToArray()) 


/// Object from Json 
let internal unjson<'t> (jsonString:string)  : 't =  
        use ms = new MemoryStream(ASCIIEncoding.Default.GetBytes(jsonString)) 
        let obj = (new DataContractJsonSerializer(typeof<'t>)).ReadObject(ms) 
        obj :?> 't

上下文:

对于文档类型

[<DataContract>]
type Document = {
    [<field: DataMemberAttribute(Name="name")>]
    Name: string

    [<field: DataMemberAttribute(Name="version")>]
    Version: string
}

JSON

let str = """{"name: "test"; version="97234982734"}"""

问题

如何使用我的示例调用 jsonunjson 函数?

为什么将函数指定为内部函数?

为了进行这种操作,我通常使用:System.Web.Extensions.JavaScriptSerializer class。 SerializeDeserialize 方法很容易使用,它们与泛型一起工作得很好。

您需要包含对 System.Web.Extensions 程序集的引用。

MSDN link: https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

否,需要 WCF 属性(即 DataContractDataMember)。

据我了解,您尝试使用的序列化程序 class 在 WCF 内部用于序列化。

代码示例:

/// Object to Json 
let internal json<'t> (myObj:'t) =   
     let ser = new System.Web.Script.Serialization.JavaScriptSerializer()   
     ser.Serialize(myObj)

/// Object from Json 
let internal unjson<'t> (jsonString:string)  : 't =  
    let ser = new System.Web.Script.Serialization.JavaScriptSerializer() 
    let obj = ser.Deserialize<'t>(jsonString)
    obj

编辑

如果您使用的是 .NET Core,您将无权访问此程序集。请参阅此 ,了解使用 Newtonsoft.Json

的替代方法