在我的c#app中,我使用json.net
库来处理jsons。
我有情况:
属性:
[JsonProperty("my_test_property_json_key", NullValueHandling = NullValueHandling.Ignore)]
public int[] MyTestProperty{ get; set; }
当我的这个专业的json看起来像:
[0,1,2,3,4,5]
一切都很棒。 但是当我有错误的json值时可能出现这样的情况:
[[0,1,2,3]]
在这种情况下,我得到了例外:
[Newtonsoft.Json.JsonReaderException] = {"Error reading integer. Unexpected token: StartArray. Path 'my_test_property_json_key[0]', line 1, position 3250."}
在这种情况下的正确行为应该是:
返回空int[]
。
当我有错误的json(属性存在,但它是一个不同的类型)时,我怎么能忽略这个属性?
注意:我的json太大了(很多其他属性) - 我不能用默认数据重新创建它(我不能丢失数据)。
答案 0 :(得分:2)
您可以创建一个尝试读取整数数组的自定义转换器,如果数据不正确,则返回一个空数组:
class MyCustomInt32ArrayConverter : JsonConverter
{
public override object ReadJson(
JsonReader reader,
Type objectType,
Object existingValue,
JsonSerializer serializer)
{
var array = serializer.Deserialize(reader) as JArray;
if (array != null)
{
return array.Where(token => token.Type == JTokenType.Integer)
.Select(token => token.Value<int>())
.ToArray();
}
return new int[0];
}
public override void WriteJson(
JsonWriter writer,
Object value,
JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(int[]);
}
}
只需使用JsonConverterAttribute
属性将转换器应用于属性:
[JsonConverterAttribute(typeof(MyCustomInt32ArrayConverter))]
[JsonProperty("my_test_property_json_key", NullValueHandling = NullValueHandling.Ignore)]
public int[] MyTestProperty{ get; set; }