JsonConvert.DeserializeObject
成功将 ['a','b']
反序列化为 List<KeyValuePair<string, object>>
。我希望它失败,只有在输入字符串像 [{'Key':'a','Value':'b'}]
时才成功。
是否有办法实现这一点?
JsonConvert.DeserializeObject
成功将 ['a','b']
反序列化为 List<KeyValuePair<string, object>>
。我希望它失败,只有在输入字符串像 [{'Key':'a','Value':'b'}]
时才成功。
是否有办法实现这一点?
看起来您可能在 Json.NET 的 KeyValuePairConverter
中发现了一个错误,即它假设读取器位于 JSON 对象的开头,而没有检查和验证位置是否正确。如果您愿意,您可以报告此问题。
与此同时,以下 JsonConverter
将针对您的情况正确地引发 JsonException
:
public class KeyValueConverter : JsonConverter
{
interface IToKeyValuePair
{
object ToKeyValuePair();
}
struct Pair<TKey, TValue> : IToKeyValuePair
{
public TKey Key { get; set; }
public TValue Value { get; set; }
public object ToKeyValuePair()
{
return new KeyValuePair<TKey, TValue>(Key, Value);
}
}
public override bool CanConvert(Type objectType)
{
bool isNullable = (Nullable.GetUnderlyingType(objectType) != null);
Type type = (Nullable.GetUnderlyingType(objectType) ?? objectType);
return type.IsGenericType
&& type.GetGenericTypeDefinition() == typeof(KeyValuePair<,>);
}
public override bool CanWrite { get { return false; } } // Use Json.NET's writer.
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
bool isNullable = (Nullable.GetUnderlyingType(objectType) != null);
Type type = (Nullable.GetUnderlyingType(objectType) ?? objectType);
if (isNullable && reader.TokenType == JsonToken.Null)
return null;
if (type.IsGenericType
&& type.GetGenericTypeDefinition() == typeof(KeyValuePair<,>))
{
var pairType = typeof(Pair<,>).MakeGenericType(type.GetGenericArguments());
var pair = serializer.Deserialize(reader, pairType);
if (pair == null)
return null;
return ((IToKeyValuePair)pair).ToKeyValuePair();
}
else
{
throw new JsonSerializationException("Invalid type: " + objectType);
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后像这样使用:
string json = @"['a','b']";
var settings = new JsonSerializerSettings { Converters = new JsonConverter[] { new KeyValueConverter() } };
var list = JsonConvert.DeserializeObject<List<KeyValuePair<string, object>>>(json, settings);
示例 fiddle。
更新
若要在 JSON 包含不存在的属性时强制出现错误,请使用 JsonSerializerSettings.MissingMemberHandling = MissingMemberHandling.Error
。
var settings = new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Error,
Converters = new JsonConverter[] { new KeyValueConverter() },
};