【发布时间】:2021-12-28 05:41:29
【问题描述】:
我使用的是 .NET 提供的 Json 命名空间,而不是 Newtonsoft 的命名空间。我有一段代码:
string text;
text = File.ReadAllText(EntityDirectory + @"\Json\AbilityTemplates.json");
foreach (AbilityTemplate template in JsonSerializer.Deserialize<List<AbilityTemplate>>(text)) {
loaderInterface.AddAbilityTemplate(template);
}
当代码运行到 JsonSerializer.Deserialize 时,抛出了一个 execption。
System.Text.Json.JsonException: 'JSON 值无法转换为 System.Collections.Generic.List`1[Enigma.Game.AbilityTemplate]。路径:$ |行号:0 | BytePositionInLine: 1.'
这是我拥有的 Json 文本:
{
{
"ID": "StandardShot",
"Price": "10",
"Size": "1",
"Rarity": "Common",
"AbilityEffectFactory": "StandardShotEffectFactory"
},
{
"ID": "SelfDestructSingleDamage",
"Price": "0",
"Size": "0",
"Rarity": "NotForPlayer",
"AbilityEffectFactory": "SelfDestructSingleDamageEffectFactory"
}
}
我用JsonConstructor Attribute写了一个构造函数,但是好像不行:
public AbilityTemplate(string id, int price, int size, Rarity rarity, AbilityEffectFactory abilityEffectFactory) {
Id = id;
Price = price;
Size = size;
Rarity = rarity;
AbilityEffectFactory = abilityEffectFactory;
}
[JsonConstructor]
public AbilityTemplate(string id, int price, int size, Rarity rarity, string abilityEffectFactory) : this(id, price, size, rarity, AbilityEffectFactory.Dictionary[abilityEffectFactory]) { }
Rarity 是一种枚举类型。
—————————编辑—————————
我把括号从{}改成[],也让json文本中的字段和参数名完全匹配,但是还是不行。 这是我的新 Json 文本:
[
{
"id": "StandardShot",
"price": "10",
"size": "1",
"rarity": "Common",
"abilityEffectFactory": "StandardShotEffectFactory"
},
{
"id": "SelfDestructSingleDamage",
"price": "0",
"size": "0",
"rarity": "NotForPlayer",
"abilityEffectFactory": "SelfDestructSingleDamageEffectFactory"
}
]
System.InvalidOperationException: 'Enigma.Game.AbilityTemplate' 类型的反序列化构造函数中的每个参数都必须绑定到反序列化时的对象属性或字段。每个参数名称必须与对象上的属性或字段匹配。匹配可以不区分大小写。'
【问题讨论】:
-
将第一对 '{ }' 替换为 "[ ]" 表示你有一个 List/Array
-
我想你已经完成了。只需删除带有
JsonConstructor属性标记的构造函数,就可以开始了。 -
能否请您edit 分享minimal reproducible example 的问题?请注意 System.Text.Json 默认区分大小写;如果您的属性名称是
Id,您可能需要设置JsonSerializerOptions.PropertyNameCaseInsensitive = true,如JsonSerializer.Deserialize fails 所示。您还需要使用JsonStringEnumConverter将枚举序列化为字符串,请参阅this answer 至ASP.NET MVC Core API Serialize Enums to String。
标签: c# json .net system.text.json