JSON.NET反序列化不会触发setter

时间:2017-03-09 21:37:57

标签: c# json.net

我有一个派生自列表的类,无论我做什么,我都找不到JSON.NET设置值的位置。在我看来,即使标记的属性也没有被解雇。

我在以下所有方面都设置了断点:

public CartItem Add(int id, int numItems, CARTITEMTYPE type = CARTITEMTYPE.GENERIC)
    {
        var item = NewByType(type);
        item.ID = id;
        item.NumItems = numItems;
        return this.Add(item);
    }

    public new CartItem Add(CartItem item)
    {
        item.Parent = this;
        base.Add(item);
        return item;
    }

    public new void AddRange(IEnumerable<CartItem> items)
    {
        items.Any(f => { f.Parent = this; return true; });
        base.AddRange(items);
    }

    public new void InsertRange(int index, IEnumerable<CartItem> items)
    {
        items.Any(f => { f.Parent = this; return true; });
        base.InsertRange(index, items);
    }

    public new CartItem Insert(int index, CartItem item)
    {
        item.Parent = this;
        base.Insert(index,item);
        return item;
    }

但是这些都没有在运行反序列化时触发中断。

反序列化过程相对简单,使用:

    public T GetJObject<T>(string cookieName, JsonSerializerSettings jset = null)
    {
        string cookieContent = Get(cookieName);
        return JsonConvert.DeserializeObject<T>(cookieContent, jset);
    }

转换器类也很简单:

public class JsonCartConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(CartItem).IsAssignableFrom(objectType);
    }

    public override bool CanWrite
    {
        get
        {
            return false;
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject obj = JObject.Load(reader);

        var type = obj["t"] != null ? (CARTITEMTYPE)obj["t"].Value<int>() : CARTITEMTYPE.GENERIC;
        var item = CartItems.NewByType(type);
        serializer.Populate(obj.CreateReader(), item);
        return item;
    }


    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {

    }
}

即使在其他类中使用JsonProperty标记的区域也没有被反序列化命中。

[JsonProperty("c")]
    public CartItems Children
    {
        get
        {
            if (_Children == null) _Children = new CartItems();
            if (_Children.Parent == null) _Children.Parent = this;
            _Children.SiteID = SiteID;
            _Children.UserID = UserID;
            return _Children;
        }
        set
        {
            Children.Parent = this;
            Console.WriteLine("we set the parent");
            _Children = value;
        }
    }

那么JSON.NET如何处理setter和list?显然,两者都没被击中?我可以强制它达到设定者逻辑吗?

编辑:JSON

[{"t":1,"i":1,"n":4,"r":false,"c":[{"t":5,"i":2,"n":4,"r":false,"c":[]}]},{"t":1,"i":3,"n":4,"r":false,"c":[{"t":5,"i":4,"n":4,"r":false,"c":[{"t":4,"i":6,"n":14,"r":false,"c":[]}]},{"t":1,"i":5,"n":15,"r":false,"c":[]}]}]

1 个答案:

答案 0 :(得分:0)

我在CartItem类(OP中的最后一个例子)中附加子项的方式得到答案。它从不调用setter,因为它使用getter抓取类,然后从那里填充它。 ...当然,子类的父级必须附加属性[JsonIgnore]。

我仍然不确定如何拦截类的填充以设置其子代的父级:

Dim strScript As String = "<script language=javascript>alert('test/page1.aspx?loctionFolder=" & 
                      Server.HtmlEncode(hdFolderLocation.Value) & "');return false; </script>"

        If Not ClientScript.IsStartupScriptRegistered(Me.GetType(), "download") Then
            Page.ClientScript.RegisterStartupScript(Me.GetType(), "download", strScript, True)
        End If

在反序列化中设置子项的Parent属性,但这是两个答案中的一个。

编辑:第二个问题由dbc在这里回答:

Intercept list population to assign values in deserialization