将 Json.NET 中的 DeserializeObject 扩展为 Try 方法

Extend DeserializeObject in Json.NET into a Try method

我一直在折磨自己试图弄清楚如何扩展泛型方法

Newtonsoft.Json.JsonConvert.DeserializeObject(Of T)(value As String)

我正在尝试编写一个扩展,如果反序列化失败,它将 return Nothing。理想情况下:

JsonConvert.TryDeserializeObject(Of T)(value As String)

我猜你所说的扩展并不是指实际的 Extension,而是扩展 Newtonsoft.JsonConvert 的一种方式。

  • 实际的扩展需要一个实例对象。 JsonConvert 是一个包含所有 shared/static 成员的类型,因此不会起作用。
  • 您也不能通过继承来扩展 class,因为它是密封的 class(不可继承)。

最接近的是字符串扩展方法:

<Extension>
Public Function JsonTryDeserialize(Of T)(json As String) As T

    Dim obj As T

    Try
        obj = JsonConvert.DeserializeObject(Of T)(json)
    Catch ex As Exception
        Return Nothing
    End Try

    Return CType(obj, T)
End Function

用法:

Dim jstr As String = ...json string from somewhere
Dim myFoo = jstr.JsonTryDeserialize(Of Foo)()

就我个人而言,我认为最好它的位置是在您作为共享函数使用的类型中;它更适用,与其他 Json 方法匹配代码更简单且智能不混乱:

Class Foo
   ... stuff

    Public Shared Function JsonTryDeserialize(json As String) As Foo
        Dim f As Foo

        Try
            f = JsonConvert.DeserializeObject(Of Foo)(json)
        Catch ex As Exception
            Return Nothing
        End Try

        Return f
    End Function
End Class

用法:

newFoo = Foo.JsonTryDeserialize(strJ)