不要返回两种可能的返回类型,最好的方法是将单个字符串强制转换为包含该字符串的数组。假设您无法控制Json,您可能需要编写自定义JsonConverter
。以下是我快速而简单的解决方案:
public class LangEntryConverter: JsonConverter<string[]>
{
public override void WriteJson(JsonWriter writer, string[] value, JsonSerializer serializer)
{
if (value.Length == 1)
{
writer.WriteValue(value[0]);
}
else
{
writer.WriteStartArray();
for (var i = 0; i < value.Length; i++)
{
writer.WriteValue(value[i]);
}
writer.WriteEndArray();
}
}
public override string[] ReadJson(JsonReader reader, Type objectType, string[] existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var values = new List<string>();
if (reader.TokenType == JsonToken.StartArray)
{
while (reader.Read() && reader.TokenType != JsonToken.EndArray)
{
if (reader.TokenType == JsonToken.String)
{
values.Add((string)reader.Value);
}
else
{
throw new Exception($"Unexpected token type: {reader.TokenType}");
}
}
}
else if (reader.TokenType == JsonToken.String)
{
values.Add((string)reader.Value);
}
return values.ToArray();
}
}
然后这样调用它:
var json = @"{
""foo"": ""one"",
""bar"": [""one"", ""two"", ""three""]
}";
var lang = JsonConvert.DeserializeObject<Dictionary<string, string[]>>(json, new LangEntryConverter());
Console.WriteLine(String.Join(", ", lang["foo"]));
Console.WriteLine(String.Join(", ", lang["bar"]));
当然,在你的具体情况下,这可能需要一些微调。
a
的值? - maccettura