2017-04-03 53 views
1

我有一些JSON,其具有INT結果,可能會返回作爲單個INT,或INT的..即列表:Newstonsoft.Json反序列化INT可能導致一個LIST <>

「錯誤碼」 [3]

「錯誤代碼」:1

我如何得到這與Newstonsoft.Json的JsonConvert反序列化?

如果我將該對象定義爲LIST,則當結果爲單個INT時會失敗,反之亦然。

+0

嘗試反序列化的錯誤代碼值轉換爲對象,檢查結果(即做出錯誤代碼。屬性是'object'類型的屬性)。 –

回答

2

我認爲你需要解決你的json的數據類型。也許永遠有它返回一個數組,以便永遠不會只有一個INT。所以,你的JSON應該是這樣的:

"ErrorCode":[3] 

那麼任何一個錯誤代碼也只是大小的數組1.

+1

不幸的是,我對Web服務的結果沒有太多的控制。所以我不能改變這一點。 –

+0

目前,我忽略了對象中的ErrorCode ...因爲這些信息在我的使用中並不那麼重要......並且它工作正常。 –

0

您可以創建一個類,如:

class MyResult { 
    public object ErrorCode {get; set;} 
} 

而且使用它來反序列化你的json:

MyResult r = JsonConvert.Deserialize<MyResult>(json); 
List<int> errorCodes; 
if (r.ErrorCode is JArray) { 
    errorCodes = (r.ErrorCode as JArray).ToObject<List<int>>(); 
    // ... 
} else { 
    errorCodes = new List<int> { Convert.ToInt32(r.ErrorCode) }; 
    // ... 
} 

希望它有幫助。

0

您可以創建自定義的JSON轉換器:

class ResolveListConverter<T> : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     List<T> list = new List<T>(); 
     if (reader.TokenType == JsonToken.StartArray) 
     { 
      reader.Read(); 
      while (reader.Value != null) 
      { 
       list.Add(Converter(reader.Value)); 
       reader.Read(); 
      } 
     } 
     else if(reader.Value != null) 
     { 
      list.Add(Converter(reader.Value)); 
     } 
     return list; 
    } 

    public T Converter(object obj) => (T)Convert.ChangeType(obj, typeof(T)); 

    public override bool CanConvert(Type objectType) => true; 
} 

那麼你可以反序列化JSON:

var result = JsonConvert.DeserializeObject<List<int>>(json, new ResolveListConverter<int>()); 
相關問題