2015-02-10 55 views
1

我一直在敲打我試圖找出如何擴展通用方法擴展DeserializeObject在Json.NET成嘗試方法

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

我試圖寫一個擴展,將返回Nothing如果反序列化失敗。理想的情況是:

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

,你已經嘗試土族多遠代碼...? – Jeremy 2015-02-10 17:46:10

+0

擴展方法適用於類實例,所以這是不可能的。你必須創建你自己的'JsonHelpers'類或類似的東西。 – 2015-02-10 17:50:11

回答

1

我猜測,推而廣之,你並不意味着實際Extension,而是一種擴展Newtonsoft.JsonConvert

  • 實際的擴展需要一個實例對象。 JsonConvert是一個包含所有共享/靜態成員的類型,所以不會工作。
  • 你也不能繼承它,因爲它是一個密封類(不可繼承)。

最接近的將是一個字符串擴展方法:

<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方法的代碼更簡單,Intellisence不凌亂:

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) 
+0

爲什麼不「Dim obj as T = Nothing」,然後在執行轉換時壓制異常。如果你只是返回obj,那麼你返回一個對象,或者什麼都不返回。 – Jeremy 2015-02-10 19:07:51

+0

你是對的 - 在解串器實際上做到這一點時,我如何創建新的T(),在我的腦海中領先於我自己,好點! – Plutonix 2015-02-10 19:14:09