如何将 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"}"""
问题
如何使用我的示例调用 json
和 unjson
函数?
为什么将函数指定为内部函数?
为了进行这种操作,我通常使用:System.Web.Extensions.JavaScriptSerializer
class。 Serialize
和 Deserialize
方法很容易使用,它们与泛型一起工作得很好。
您需要包含对 System.Web.Extensions
程序集的引用。
MSDN link: https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
否,需要 WCF 属性(即 DataContract
或 DataMember
)。
据我了解,您尝试使用的序列化程序 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
的替代方法
我在 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"}"""
问题
如何使用我的示例调用 json
和 unjson
函数?
为什么将函数指定为内部函数?
为了进行这种操作,我通常使用:System.Web.Extensions.JavaScriptSerializer
class。 Serialize
和 Deserialize
方法很容易使用,它们与泛型一起工作得很好。
您需要包含对 System.Web.Extensions
程序集的引用。
MSDN link: https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
否,需要 WCF 属性(即 DataContract
或 DataMember
)。
据我了解,您尝试使用的序列化程序 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