如何处理在参数化构造函数上执行json.net反序列化时引发的异常

时间:2012-11-16 05:43:15

标签: c# .net serialization json.net

我正在使用Json.net 4.5。我使用Json对PatientV1进行了序列化,并尝试进入PatientV2进行消毒。序列化发生得很好。

但是当我在AppUtility.CreatePatientNr中引入验证检查时(如果传递任何空值或空值则抛出异常),反序列化失败。

我已经尝试使用派生的JsonConverter创建PatientV2对象,我有控件将“Proper”值传递给构造函数,但是在创建对象之后我将无法设置正确的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是否有任何特定的反序列化构造函数,就像二进制序列化一样?

1 个答案:

答案 0 :(得分:0)

Json首先使用默认构造函数尝试对象,如果找不到,那么它会占用第一个参数化构造函数并将空数据传递给它。 Json没有像二进制序列化那样用于构造对象的特定构造函数。

但是,如果您有实现ISerializable的对象,则调用序列化构造函数。

可以使用的方法如下

  1. 在JsonConverter中通过传递适当的值来创建对象 参数化构造函数
  2. 从可能引发的构造函数中删除业务逻辑 异常。
  3. 将所有的持久性简单化为一个没有任何结构的结构 商业逻辑(贫血模型)
  4. 我现在将采用方法1)然后2)以后3)。由于传统的巨大代码原因,方法2)和3)需要一些时间