gpt4 book ai didi

c# - JSON.NET 反序列化不触发 setter

转载 作者:行者123 更新时间:2023-12-04 16:10:33 24 4
gpt4 key购买 nike

我有一个派生自列表的类,但无论我做什么,我都找不到 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 和列表的呢?显然,两者都没有被击中?我可以强制它达到 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":[]}]}]

最佳答案

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

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

Public CartItems : List<CartItem>

关于反序列化以设置子项的 Parent 属性,但这是两个答案之一。

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

Intercept list population to assign values in deserialization

关于c# - JSON.NET 反序列化不触发 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42705909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com