如何在 class 中定义变量以在反序列化 JSON 时接收 List<string> 或字符串?
How to define variable in class to receive either List<string> or string when deserializing JSON?
有没有办法声明一个 class 我可以接收一个列表或字符串的特定变量?
我正在尝试反序列化 JSON,它可以采用以下格式之一:
"MercadoriasPresencaCarga": {
"Mercadoria": 7693066,
"Descarga": "08/07/2017 13:35:39"
},
或
"MercadoriasPresencaCarga": {
"Mercadoria": [
"7693066"
],
"Descarga": [
"08/07/2017 13:35:39"
]
},
这个块的 class 是这样创建的:
public class MercadoriasPresencaCarga
{
public List<string> Mercadoria { get; set; }
public List<string> Descarga { get; set; }
}
问题是,如果 JSON 的这个块作为我显示的第一个格式出现在它不是数组的地方,它会导致反序列化错误。
我该如何解决这个问题?
理想情况下,json 应始终采用相同的格式,但如果这不可能,则有一些解决方法。
两个 json 字符串都将使用以下 class:
成功反序列化
public class Model
{
// other properties here
// ....
[JsonIgnore]
public string Mercadoria => GetValue("Mercadoria");
[JsonIgnore]
public string Descarga => GetValue("Descarga");
public JObject MercadoriasPresencaCarga { get; set; }
private string GetValue(string path)
{
if (MercadoriasPresencaCarga == null)
{
return null;
}
string value = null;
JToken token = MercadoriasPresencaCarga.SelectToken(path);
if (token.Type == JTokenType.Array && token.HasValues)
{
value = token.First.Value<string>();
}
else
{
value = token.Value<string>();
}
return value;
}
}
请注意:
MercadoriasPresencaCarga
将被反序列化为 JObject
Mercadoria
和Descarga
都是不可序列化的属性(标有[JsonIgnore]
)
测试代码 - json 具有字符串属性的字符串(无数组):
string json1 = @"{
""MercadoriasPresencaCarga"": {
""Mercadoria"": 7693066,
""Descarga"": ""08/07/2017 13:35:39""
}
}";
Model model1 = JsonConvert.DeserializeObject<Model>(json1);
Console.WriteLine($"Descarga: {model1.Descarga}, Mercadoria: {model1.Mercadoria}");
测试代码 - json 带数组的字符串:
string json2 = @"{
""MercadoriasPresencaCarga"": {
""Mercadoria"": [
""7693066""
],
""Descarga"": [
""08/07/2017 13:35:39""
]
}
}";
Model model2 = JsonConvert.DeserializeObject<Model>(json2);
Console.WriteLine($"Descarga: {model2.Descarga}, Mercadoria: {model2.Mercadoria}");
有没有办法声明一个 class 我可以接收一个列表或字符串的特定变量?
我正在尝试反序列化 JSON,它可以采用以下格式之一:
"MercadoriasPresencaCarga": {
"Mercadoria": 7693066,
"Descarga": "08/07/2017 13:35:39"
},
或
"MercadoriasPresencaCarga": {
"Mercadoria": [
"7693066"
],
"Descarga": [
"08/07/2017 13:35:39"
]
},
这个块的 class 是这样创建的:
public class MercadoriasPresencaCarga
{
public List<string> Mercadoria { get; set; }
public List<string> Descarga { get; set; }
}
问题是,如果 JSON 的这个块作为我显示的第一个格式出现在它不是数组的地方,它会导致反序列化错误。
我该如何解决这个问题?
理想情况下,json 应始终采用相同的格式,但如果这不可能,则有一些解决方法。
两个 json 字符串都将使用以下 class:
成功反序列化public class Model
{
// other properties here
// ....
[JsonIgnore]
public string Mercadoria => GetValue("Mercadoria");
[JsonIgnore]
public string Descarga => GetValue("Descarga");
public JObject MercadoriasPresencaCarga { get; set; }
private string GetValue(string path)
{
if (MercadoriasPresencaCarga == null)
{
return null;
}
string value = null;
JToken token = MercadoriasPresencaCarga.SelectToken(path);
if (token.Type == JTokenType.Array && token.HasValues)
{
value = token.First.Value<string>();
}
else
{
value = token.Value<string>();
}
return value;
}
}
请注意:
MercadoriasPresencaCarga
将被反序列化为JObject
Mercadoria
和Descarga
都是不可序列化的属性(标有[JsonIgnore]
)
测试代码 - json 具有字符串属性的字符串(无数组):
string json1 = @"{
""MercadoriasPresencaCarga"": {
""Mercadoria"": 7693066,
""Descarga"": ""08/07/2017 13:35:39""
}
}";
Model model1 = JsonConvert.DeserializeObject<Model>(json1);
Console.WriteLine($"Descarga: {model1.Descarga}, Mercadoria: {model1.Mercadoria}");
测试代码 - json 带数组的字符串:
string json2 = @"{
""MercadoriasPresencaCarga"": {
""Mercadoria"": [
""7693066""
],
""Descarga"": [
""08/07/2017 13:35:39""
]
}
}";
Model model2 = JsonConvert.DeserializeObject<Model>(json2);
Console.WriteLine($"Descarga: {model2.Descarga}, Mercadoria: {model2.Mercadoria}");