gpt4 book ai didi

c# - 使用自定义 JsonConverter 时无限转换循环

转载 作者:行者123 更新时间:2023-11-30 12:42:45 25 4
gpt4 key购买 nike

在我当前的项目中,我遇到了一个问题,即在尝试转换 Item 或其任何子类(如 ArmorItem)时,我最终陷入了无限循环。
为了检测我必须反序列化哪种类型的 Item,我使用了一个名为 ItemConverter 的自定义 JsonConverter

项目.cs:

[JsonObject(MemberSerialization.OptIn), JsonConverter(typeof(ItemConverter))]
public class Item
{
[JsonProperty("id")] public int Id { get; }
[JsonProperty("type")] public string ItemType { get; }

[JsonConstructor]
public Item(int id, string itemType)
{
Id = id;
ItemType = itemType;
}
}

ArmorItem.cs

[JsonObject(MemberSerialization.OptIn)]
public sealed class ArmorItem : Item
{
[JsonProperty("defense")] public int Defense { get; }

[JsonConstructor]
public ArmorItem(int id, string itemType, int defense) : base(id, itemType)
{
Defense = defense;
}
}

ItemConverter.cs

public sealed class ItemConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}

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

switch (item["type"].Value<string>())
{
case "Armor":
return item.ToObject<ArmorItem>();
default:
return item.ToObject<Item>();
}
}

public override bool CanConvert(Type objectType)
=> typeof (Item).IsAssignableFrom(objectType);
}

我通常从网络获取 json 数据并直接使用 WebResponse.GetResponseStream 流来反序列化数据。

using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse())
using (JsonTextReader reader = new JsonTextReader(new StreamReader(resp.GetResponseStream())))
{
return new JsonSerializer().Deserialize<Item>(reader);
}

我知道为什么会出现这个循环,但我无法修复它。
但是我注意到,当以不同的方式反序列化 json 数据时,问题没有发生。
(通过删除 JsonConverter 属性为此更改了 Item)

string json = "SOME JSON DATA HERE";
Item item = JsonConvert.DeserializeObject<Item>(json, new ItemConverter());

不幸的是,我无法使用流修复现有代码,并且我不想将传入的 json 数据临时存储到字符串中以便能够使用工作代码。
有什么想法可以打破循环吗?

最佳答案

另一种方法是使用serializer.Populate():

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

switch (item["type"].Value<string>())
{
case "Armor":
var armorItem = new ArmorItem();
serializer.Populate(item.CreateReader(), armorItem);
return armorItem;
default:
var defaultItem = new Item();
serializer.Populate(item.CreateReader(), defaultItem);
return defaultItem;
}
}

更多信息请访问 https://gist.github.com/chrisoldwood/b604d69543a5fe5896a94409058c7a95

关于c# - 使用自定义 JsonConverter 时无限转换循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32783849/

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