如何在Generics中使用DataContractJsonSerializer

时间:2018-04-01 11:18:36

标签: generics asp.net-core f# deserialization json-deserialization

我在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函数?

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

1 个答案:

答案 0 :(得分:1)

要执行此类操作,我通常使用:System.Web.Extensions.JavaScriptSerializer类。使用SerializeDeserialize方法很容易使用Generics。

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

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

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

我理解它的方式您尝试使用的序列化程序类在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

的替代方法,请参阅此post