【问题标题】:JavascriptDeserializer for custom collection用于自定义集合的 JavascriptDeserializer
【发布时间】:2011-03-21 17:06:59
【问题描述】:

我有一个自定义集合类型,如下所示:

Namespace Collections
    Public Class KeyValuePairCollection(Of TKey, TValue)
        Inherits List(Of KeyValuePair(Of TKey, TValue))

        Public Sub New()
            MyBase.New()
        End Sub

        Friend Sub New(ByVal innerCollection As IEnumerable(Of KeyValuePair(Of TKey, TValue)))
            Me.New()
            Me.AddRange(innerCollection)
        End Sub

        Public Overloads Sub Add(ByVal key As TKey, ByVal value As TValue)
            Dim item As New KeyValuePair(Of TKey, TValue)(key, value)
            MyBase.Add(item)
        End Sub

    End Class
End Namespace

我想使用自定义 JavascriptConverter 从 JSON 反序列化这种类型的实例

Public Class CustomConverter(Of TKey, TValue)
        Inherits JavaScriptConverter

        Public Overrides ReadOnly Property SupportedTypes() As IEnumerable(Of Type)
            Get
                Return New ReadOnlyCollection(Of Type)(New List(Of Type) _
                 (New Type() {GetType(KeyValuePairCollection(Of TKey, TValue))}))
            End Get
        End Property

        Public Overrides Function Serialize(ByVal obj As Object, _
         ByVal serializer As JavaScriptSerializer) As IDictionary(Of String, Object)
            Throw New NotSupportedException("This class can be used only for deserialization.")
        End Function

        Public Overrides Function Deserialize(ByVal dictionary As IDictionary(Of String, Object), _
         ByVal type As Type, ByVal serializer As JavaScriptSerializer) As Object

            Return Nothing

        End Function
    End Class

反序列化代码:

Dim serializer As New JavaScriptSerializer
serializer.RegisterConverters(New CustomConverter(){New CustomConverter(Of Integer, String)})
serializer.Deserialize(Of MyClass)(serializedObject)

MyClass 有一个 KeyValuePairCollection 类型的字段。 当我调试此代码并将断点设置为 Deserialize 方法时...永远不会调用此方法。我只是得到以下异常:

价值 “System.Collections.Generic.Dictionary2[System.String,System.Object]" is not of type "System.Collections.Generic.KeyValuePair2[System.Int32,System.String]” 并且不能在这个泛型中使用 收藏。参数名称:值

注意

当我在 MyClass 中使用 List(Of KeyValuePair(Of Integer, String)) 而不是 KeyValuePairCollection(Of Integer, String) 时,一切都很好

【问题讨论】:

    标签: .net json deserialization


    【解决方案1】:

    您在调用RegisterConverters 时使用了IntegerString 的键值对,而在CustomConverter 中您正在寻找String, Object,因此无法匹配。

    因此,您可能想要更改您的 Deserialize 方法,但我认为通过扩展 JavaScriptConverter 会遇到问题,并且您可能需要在不扩展的情况下这样做,但是,我使用 C# 而不是 VB.NET 这样做我不确定你的最佳方法。

    【讨论】:

    • 感谢您的回答。但我不确定我是否理解......你能澄清一下吗?为什么我在使用 JavascriptConverter 时会遇到问题?如何在没有 JavascriptConverter 类的情况下反序列化我的集合?你能提供一个关于 C# 的例子吗?
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多