2015-11-17 46 views
0

我使用存在的API並且無法更改它。JSON序列化 - 爲int類型設置默認值

所以我有一些變量--CellProviderID。

它看起來像一個int,因爲當我設置int值時,服務器返回預期的響應。

"CellProviderID":5,"CellProviderID2":7,"CellProviderID3":2 

的問題,當我離開這個值空出現,系列化後,我得到:

"CellProviderID":0,"CellProviderID2":0,"CellProviderID3":0 

,因爲0是整型的默認值。並且服務器返回一個錯誤:

{"ErrorCode":10,"ErrorMessage":"Cell provider was specified, but cell number is blank, Pager provider was specified, but pager number is blank"}

因此,它看起來像它是一些枚舉,並且0沒有值。

它運作良好,當我改變序列化JSON從

"CellProviderID":0,"CellProviderID2":0,"CellProviderID3":0 

"CellProviderID":"","CellProviderID2":"","CellProviderID3":"" 

我應該如何初始化屬性可以設置int類型,並得到「」當我離開這個屬性空?

[JsonProperty] 
public int CellProviderID { get; set; } 
[JsonProperty] 
public int CellProviderID2 { get; set; } 
[JsonProperty] 
public int CellProviderID3 { get; set; } 
+1

怎麼樣試圖讓你的int類型的屬性?這樣他們可以爲空(並看看序列化如何反應) – Batavia

+0

他們是整數。整數的默認值爲零,內容爲空。 – iPogosov

+3

@iPogosov他的意思是'int?',而不是帶問號的'int'。 'int?'是'Nullable '的簡寫形式,表示類型可以是'null' *或* int'。也就是說,將你的屬性改爲:'public int? CellProviderID {get;組; }' – Rob

回答

2

你可以改變你的屬性的返回類型從intint?,所以你會得到null值作爲默認值。

將序列化爲

"CellProviderID":null,"CellProviderID2":null,"CellProviderID3":null 

這樣你就可以有一個交易。

接下來,您必須將您的序列化更改爲忽略null值。如果您使用Json.Net,你係列化必須像:

JsonConvert.SerializeObject(movie,Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }) 

所以,你的服務器將不接受未初始化值

+0

這不是我想要的,但它的工作原理。謝謝。 – iPogosov

2

你可以選擇寫一個自定義JsonConverter和處理的自定義序列化/反序列化自己。

internal class Inherited 
{ 
    public int MyProperty { get; set; } 
    public int MyProperty2 { get; set; } 
} 

internal class CustomConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(Inherited); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var data = value as Inherited; 
     if (data != null) 
     { 
      writer.WriteStartObject(); 
      foreach (var item in typeof(Inherited).GetProperties()) 
      { 
       writer.WritePropertyName(item.Name); 
       switch (item.PropertyType.Name) 
       { 
        case "Int32": 
         { 
          writer.WriteValue(default(int) == (int)item.GetValue(data, null) ? "" : item.GetValue(data, null).ToString()); 
          break; 
         } 
       } 
      } 

      writer.WriteEnd(); 
     } 
    } 
} 

JsonSerializerSettings obj = new JsonSerializerSettings(); 
obj.Converters.Add(new CustomConverter()); 
var result = JsonConvert.SerializeObject(new Inherited(0) { MyProperty = 0, MyProperty2 = 0 }, obj); 

結果 - { 「myProperty的」: 「」, 「MyProperty2」: 「」}

+0

據我瞭解,如果我在繼承類的int屬性中,當我可以設置默認的詮釋值(0),我會永遠得到「」? – iPogosov

+0

試一試。我想是這樣。 –