2012-11-16 64 views
1

我正在使用Json.net 4.5。我已經使用Json序列化了PatientV1,並試圖將其滅活到PatientV2中。序列化發生很好。如何處理在參數化構造函數上執行json.net反序列化時引發的異常

但是,當我在AppUtility.CreatePatientNr(如果傳遞任何空值或空值時拋出異常)中引入驗證檢查,則反序列化失敗。

我已經嘗試使用派生的JsonConverter來創建PatientV2對象,我有控制權將「正確」值傳遞給構造函數,但是我無法在創建對象之後設置正確的PatientNr,因爲它是隻讀的。

我不想使用反射。 Json.net是否提供了在JsonConverter中設置只讀屬性patientV2.PatientNr的方法?

有沒有辦法忽略此異常或任何其他的方法來創建PatientV2對象?

//version 1.0. Legacy code with no Json tag 
    public class PatientV1 
    { 
     public int PatId { get; set; } 
    } 

    //Version 2.0 
    public class PatientV2 
    { 
     public PatientV2(string Id, string s1, string s2) 
     { 
      PatientNr = AppUtility.CreatePatientNr(Id, s1, s2); 
     } 

     //PatId is renamed to a string type. It now has private set 
     [JsonProperty("PatId")] 
     public string PatientNr { get; private set; } 
    } 

EDIT1:不JSON有用於deserialisation就像二進制序列化任何具體的構造?

+1

你爲什麼不try/catch語句在構造函數中的'AppUtility.CreatePatientNr'電話嗎? – nemesv

+0

在我的正常用法中,我想要引發異常,以便在不傳遞適當的值來構造對象時不應創建對象。將參數驗證代碼移到構造函數的外部將需要更多的努力來處理所有這些類似的類,所以試圖找出一個更好的簡單方法 – keyr

+0

[如何將參數傳遞給非默認構造函數?](http:// stackoverflow .COM /問題/ 8254503 /如何到傳遞參數到一個-非默認的構造函數) – Flexo

回答

0

的Json首先嚐試使用默認的構造函數的對象,如果沒有找到一個那麼它則佔據了第一參數的構造函數和空數據傳遞給它。 Json用於構建對象的具體構造函數就像二進制序列化一樣。

然而,如果你有一個實現了ISerializable然後序列化構造函數被調用的對象。

方法之一可以使用如下

  1. 在JsonConverter通過傳遞適當的值 的參數的構造函數
  2. 從構造函數中刪除業務邏輯可能會引發 例外創建對象。
  3. 讓所有的堅持,能夠簡單地無任何 業務邏輯(貧血模型)的結構

我將目前將與方法1去),然後2)後來3)。由於遺留鉅額代碼原因接近2),3)需要一定的時間

相關問題