2012-03-22 116 views
5

舉例來說,如果我有當使用newtonsoft json.net對一個字符串進行反序列化時,如何將一個空字符串轉換爲null爲空的int?

public class MyClass 
{ 
    public Int32? Id { get;set; } 
    public string Description { get;set; } 
} 

和我的JSON字符串看起來是這樣的:

"{\"Id\":\"\",\"Description\":\"test\"}" 

我得到的錯誤「無法字符串轉換爲整數」

+3

該值*是一個字符串,你不能修復JSON嗎? – svick 2012-03-25 19:52:56

+0

此外,它實際上適用於我,我沒有得到任何錯誤。你能發佈重現你的問題的確切代碼嗎?你使用的是哪個版本的JSON.NET? – svick 2012-03-25 20:02:11

回答

18

像svick說,你應該修復你的Json。但是,如果它是你無法控制的外部Json,那麼你可以使用JsonConverter。

public class StringToNIntConverter : JsonConverter 
{ 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(int?); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
      return null; 
     if (reader.TokenType == JsonToken.Integer) 
      return reader.Value; 

     if (reader.TokenType == JsonToken.String) 
     { 
      if (string.IsNullOrEmpty((string)reader.Value)) 
       return null; 
      int num; 
      if (int.TryParse((string)reader.Value, out num)) 
       return num; 

      throw new JsonReaderException(string.Format("Expected integer, got {0}", reader.Value)); 
     } 
     throw new JsonReaderException(string.Format("Unexcepted token {0}", reader.TokenType)); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteValue(value); 
    } 
} 

public class MyClass 
{ 
    [JsonConverter(typeof(StringToNIntConverter))] 
    public Int32? Id { get; set; } 
    public string Description { get; set; } 
} 
+0

回到版本4.0.4工作。它現在允許將空值傳遞給可爲null的整數。 謝謝你的回覆。 – user1286307 2012-03-29 19:34:17

+3

+1不錯的工作,拯救了我的培根! – 2012-06-21 20:32:05

+0

使用Json.NET版本4.5我發現reader.Value返回一個很長的,因此我不得不改變返回reader.Value;返回Convert.ToInt32(reader.Value); – s1mm0t 2013-07-29 10:20:35

相關問題