你可以做的是試圖反序列化相應JSON價值爲基礎類型時,非空,並且在失敗時,返回null所有可空類型一JsonConverter
:
public class NullableTypeConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return Nullable.GetUnderlyingType(objectType) != null;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var underlyingType = Nullable.GetUnderlyingType(objectType);
if (underlyingType == null)
throw new JsonSerializationException("Invalid type " + objectType.ToString());
var token = JToken.Load(reader);
try
{
return token.ToObject(underlyingType, serializer);
}
catch (Exception ex)
{
// Log the exception somehow
Debug.WriteLine(ex);
return null;
}
}
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然後use it反序列化你的類。
var settings = new JsonSerializerSettings { Converters = new[] { new NullableTypeConverter() } };
轉換器仍然會拋出異常(從調用JToken.Load()
)如果JSON本身是不正確,無法讀取。如果在加載後無法將JSON值轉換爲適當的類型,它只會吞下異常。
來源
2016-02-11 21:14:12
dbc
可能的替代方法是將您的類中的定義更改爲「object」,然後執行檢查文章解析。或者可能類似[this](http://stackoverflow.com/questions/19747914/change-default-null-value-in-json-net)讓我知道如果我誤你的意圖。 – Gabe
@Gabe將C#屬性的類型更改爲對象可能會起作用,但如果可能,我寧願不這樣做,因爲我希望C#類中的所有屬性都是正確的類型。我想要做的是採取如下這樣的JSON響應:{「count」:「T」}(其中計數應該被定義爲一個整數),並在C#中使用Count屬性的值爲null類。在實際的迴應中,有更多的領域比一個更多,所以我不想丟棄整個記錄。我只想爲每個屬性設置一個默認值,比如null。謝謝你的幫助。 – ashipma
dbc的自定義轉換器是最好的選擇 - 你仍然需要空檢查。您可以執行默認值和註釋,但這些都不會阻止反序列化時產生的問題。有幾個模型和轉換器是迄今爲止最可用的選項。然而,我很好奇 - 爲什麼將空值/空值存儲爲字符串?你使用它的泛型(可能沒有給你想要它爲空)?你有權訪問數據傳遞/存儲的方式嗎?數據庫限制?在'發件人'一方解決這個問題可以解決你所有的問題。 – Gabe