【问题标题】:How to use DataContractJsonSerializer with Generics如何将 DataContractJsonSerializer 与泛型一起使用
【发布时间】:2018-04-01 11:18:36
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    要执行此类操作,我通常使用:System.Web.Extensions.JavaScriptSerializer 类。 SerializeDeserialize 方法很容易使用,它们与泛型配合得很好。

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

    Msdn 链接: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,您将无权访问此程序集。请参阅此post,了解使用Newtonsoft.Json 的替代方法

    【讨论】:

    • 很好,但是我没有看到 F# 示例,我的示例代码有什么实现吗?
    • 我会看看在没有 IDE 或语法检查的情况下我能在手机上接近多远...来...
    • 感谢代码,我会接受答案,但你知道吗,我在 .net core 上,我没有这个库 :-)
    • @App2015 请参阅与 .NET Core 相关的更新。希望这会有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2011-02-09
    • 2019-03-21
    • 2017-01-11
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多