JSON.NET 反序列化未触发 setter 方法

4

我有一个从列表派生的类,无论我做什么,我都找不到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?显然,两者都没有被触发?我能强制它触发 Setter 逻辑吗?
编辑: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":[]}]}]

那么它是否命中了其中任何一个?通过检查生成的类,似乎最后一个示例的setter从未被调用过?我从未看到父级被设置... - dudeinco
它是否使用反射来绕过setter逻辑,并完全规避类中的标准添加/插入功能,通过强制将值写入私有属性? - dudeinco
JSON.NET 不会在您的对象上调用任何“add/insert”方法。 - hyankov
@dman2306,对不起,你是正确的。我刚刚尝试了一下。在调试期间,我的setter中断点确实被触发了。为避免进一步混淆,我将删除我的评论。 - hyankov
@dudeinco,如果它没有触发您的断点,那么可能是您尝试反序列化的JSON与您的对象属性不匹配。也许您应该在这里发布JSON。 - hyankov
显示剩余2条评论
1个回答

2
我可以翻译这段话:

我已经找到了关于如何在CartItem类中附加子项的答案(即原帖中的最后一个示例)。它从未调用setter方法,因为它是使用getter获取该类,然后从那里填充它。 ... 当然,子类的父类必须附加属性[JsonIgnore]。

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

Public CartItems : List<CartItem>

在反序列化时设置子项的父属性,但这只是两个答案之一。
编辑:第二个问题由dbc在此处回答:
拦截列表填充以在反序列化中分配值。

1
是的,如果集合已经预先分配,它就不会被重置。请参阅为什么使用.NET Newtonsoft.Json组件反序列化一些有效的JSON时,我的POCO中的所有集合都为空?以获取相关问题的答案。 - dbc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接