我正在尝试使用.net内置函数反序列化对象。
让我们看看我尝试反序列化的数组“attributes”:
"attributes": [
{
"trait_type": "Subseries",
"value": "Templar Order"
},
{
"trait_type": "Colorfulness",
"value": 2,
"min_value": 1,
"max_value": 5
},
{
"trait_type": "Style",
"value": "CGI"
},
{
"trait_type": "Material",
"value": "Steel"
},
{
"trait_type": "Special Effects",
"value": "Rare"
},
{
"trait_type": "Background",
"value": "Rare"
}],
正如您所看到的,属性总是具有trait_type和值。
值可以是string或int类型。
最小值和最大值是可选,且总是int类型。
我正在纠结的是字段“value”。我试图从它创建一个类,但JSON反序列化器不会只将int转换为字符串(我会很好)
public class MetadataAttribute
{
public MetadataAttribute(string Trait_Type, string Value)
{
trait_type = Trait_Type;
value = Value;
}
public MetadataAttribute(string Trait_Type, int Value, int? Min_Value = null, int? Max_Value = null)
{
trait_type = Trait_Type;
value = Value.ToString();
min_value = Min_Value;
max_value = Max_Value;
}
public MetadataAttribute() { }
/// <summary>
/// the attribute name, eg sharpness
/// </summary>
public string trait_type { get; set; }
/// <summary>
/// the value of the attribute, eg 10
/// </summary>
public string value { get; set; }
/// <summary>
/// optional: the minimum value atribute to provide a possible range
/// </summary>
public int? min_value{get;set;}
/// <summary>
/// optional: the maximum value attribute to provide a possible range
/// </summary>
public int? max_value { get; set; }
}
当前反序列化器函数(当值中没有int时有效)
public static Metadata Load(string path)
{
FileInfo testFile = new FileInfo(path);
string text = File.ReadAllText(testFile.FullName);
Metadata json = JsonSerializer.Deserialize<Metadata>(text);
return json;
}
我该如何解决这种模糊性?
2条答案
按热度按时间vfh0ocws1#
如果您可以定义两个数据模型,例如:
那么您可以为
TraitInfo
创建一个JsonConverter
并且在反序列化期间,您可以指定此转换器
请注意,如果在
TraitInfo
上使用JsonConverterAttribute
,则ReadJson
将处于无限循环中。DotnetFiddle link
ego6inou2#
最好使用Newtonsoft.Json,但您可以更改该类以避免使用自定义序列化程序