我用.NET 6编写了一个测试程序
static void Main(string[] args) {
JsonSerializerOptions options = new JsonSerializerOptions() {
Converters = {
new JsonStringEnumConverter(),
new JsonStringAbilityEffectFactoryConverter()
}
};
AbilityTemplate dictionary = JsonSerializer.Deserialize<AbilityTemplate>(@"
{
""Id"": ""StandardShot"",
""Price"": 10,
""Size"": 1,
""Rarity"": ""Common"",
""AbilityEffectFactory"": {
""Id"":""StandardShotEffectFactory""
},
""PropertyBasicValues"": {
""CoolDownRate"": 5,
""CastRate"": ""Infinity""
}
}
");
}
}
internal class JsonStringAbilityEffectFactoryConverter : JsonConverter<AbilityEffectFactory> {
public override AbilityEffectFactory Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
string id = "";//Break point here. This method is just casually implemented because I am merely especting this method to be called.
while (reader.Read()) {
id = reader.GetString();
}
return AbilityEffectFactory.Dictionary[id];
}
public override void Write(Utf8JsonWriter writer, AbilityEffectFactory value, JsonSerializerOptions options) {
throw new NotImplementedException();
}
}我的AbilityTemplate课程是这样的:
public class AbilityTemplate : RarityObject {
public AbilityTemplate(string id, int price, int size, Rarity rarity, AbilityEffectFactory abilityEffectFactory, in Ability.PropertyCollection propertyBasicValues) {
Id = id;
Price = price;
Size = size;
Rarity = rarity;
AbilityEffectFactory = abilityEffectFactory;
PropertyBasicValues = propertyBasicValues;
}
internal static readonly Dictionary<string, AbilityTemplate> dictionary = new Dictionary<string, AbilityTemplate>();
public static IReadOnlyDictionary<string, AbilityTemplate> Dictionary => dictionary;
public string Id { get; }
public int Price { get; }
public override Rarity Rarity { get; }
public int Size { get; }
public AbilityEffectFactory AbilityEffectFactory { get; }
public Ability.PropertyCollection PropertyBasicValues { get; }
}父类RarityObject只是一个简单的抽象类,其中有一个字段被覆盖:
public abstract class RarityObject {
public abstract Rarity Rarity { get; }
}但是,当代码执行时,我被抛出异常:
System.InvalidOperationException:“类型'Enigma.Game.AbilityTemplate‘的反序列化构造函数中的每个参数都必须绑定到反序列化时的对象属性或字段。每个参数名必须与对象上的属性或字段匹配。这场比赛可能是不敏感的。
我不明白这种异常是怎么发生的。用Json文本编写的每个字段都已经与我的AbilityTemplate类的属性完全匹配。
Update0 My AbilityEffectFactory是一个抽象类,也许这就是问题所在。
Update1 I对转换器进行了如下修改:
internal class JsonStringAbilityTemplateConverter : JsonConverter<AbilityTemplate> {
public override AbilityTemplate Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
string id = "";//Break point
while (reader.Read()) {
id = reader.GetString();
}
return new AbilityTemplate();
}
public override void Write(Utf8JsonWriter writer, AbilityTemplate value, JsonSerializerOptions options) {
throw new NotImplementedException();
}
}但我还是有例外:
System.NotSupportedException:“不支持没有无参数构造函数、单一参数化构造函数或带”JsonConstructorAttribute“注释的参数化构造函数的类型反序列化。输入'Enigma.Game.AbilityEffectFactory‘。路径:$.AbilityEffectFactory \ LineNumber: 6\x{e76f} BytePositionInLine: 45‘
而断点不是hit.How,因为系统已经读取到第6行了,这是否是可确定的?
发布于 2022-01-08 14:16:45
。
如果您想反序列化json,
。
AbilityTemplate abilityTemplate = JsonConvert.DeserializeObject<AbilityTemplate>(json);班级
public class AbilityTemplate
{
[JsonConstructor]
public AbilityTemplate(string id, int price, int size, string rarity, Dictionary<string, object> abilityEffectFactory, in Dictionary<string,object> propertyBasicValues)
{
Id = id;
Price = price;
Size = size;
Rarity = rarity;
AbilityEffectFactory = abilityEffectFactory;
PropertyBasicValues = propertyBasicValues;
}
internal static readonly Dictionary<string, AbilityTemplate> dictionary = new Dictionary<string, AbilityTemplate>();
public static IReadOnlyDictionary<string, AbilityTemplate> Dictionary => dictionary;
public string Id { get; }
public int Price { get; }
public string Rarity { get; }
public int Size { get; }
public Dictionary<string,object> AbilityEffectFactory { get; }
public Dictionary<string,object> PropertyBasicValues { get; }
}中。
发布于 2022-01-09 05:07:32
我最终通过不使用JsonConverter完成了这一任务。如下图所示,我编写了可以转换为目标类的中间类。
public static partial class EntityLoader {
private class AbilityTemplateJsonObject {
public string Id { get; set; }
public int Price { get; set; }
public int Size { get; set; }
public string Rarity { get; set; }
public string AbilityEffectFactory { get; set; }
public AbilityPropertyCollectionJsonObject PropertyBasicValues { get; set; }
public AbilityTemplate ConvertToAbilityTemplate() {
return new AbilityTemplate(Id, Price, Size, Enum.Parse<Rarity>(Rarity), Game.AbilityEffectFactory.Dictionary[AbilityEffectFactory], PropertyBasicValues.ConvertToAbilityPropertyCollection());
}
}
private class AbilityPropertyCollectionJsonObject {
public double Strength { get; set; }
public double FireRate { get; set; }
public double PerFireQuantity { get; set; }
public double CoolDownRate { get; set; }
public double CastRate { get; set; }
public double Range { get; set; }
public double ExplosionRange { get; set; }
public double ExplosionStrength { get; set; }
public double ManaConservation { get; set; }
public double ManaStorage { get; set; }
public Ability.PropertyCollection ConvertToAbilityPropertyCollection() {
return new Ability.PropertyCollection() {
[Ability.PropertyType.Strength] = Strength,
[Ability.PropertyType.FireRate] = FireRate,
[Ability.PropertyType.PerFireQuantity] = PerFireQuantity,
[Ability.PropertyType.CoolDownRate] = CoolDownRate,
[Ability.PropertyType.CastRate] = CastRate,
[Ability.PropertyType.Range] = Range,
[Ability.PropertyType.ExplosionRange] = ExplosionRange,
[Ability.PropertyType.ExplosionStrength] = ExplosionStrength,
[Ability.PropertyType.ManaConservation] = ManaConservation,
[Ability.PropertyType.ManaStorage] = ManaStorage
};
}
}https://stackoverflow.com/questions/70632275
复制相似问题