我有一些JSON,其具有INT結果,可能會返回作爲單個INT,或INT的..即列表:Newstonsoft.Json反序列化INT可能導致一個LIST <>
「錯誤碼」 [3]
或
「錯誤代碼」:1
我如何得到這與Newstonsoft.Json的JsonConvert反序列化?
如果我將該對象定義爲LIST,則當結果爲單個INT時會失敗,反之亦然。
我有一些JSON,其具有INT結果,可能會返回作爲單個INT,或INT的..即列表:Newstonsoft.Json反序列化INT可能導致一個LIST <>
「錯誤碼」 [3]
或
「錯誤代碼」:1
我如何得到這與Newstonsoft.Json的JsonConvert反序列化?
如果我將該對象定義爲LIST,則當結果爲單個INT時會失敗,反之亦然。
我認爲你需要解決你的json的數據類型。也許永遠有它返回一個數組,以便永遠不會只有一個INT。所以,你的JSON應該是這樣的:
"ErrorCode":[3]
那麼任何一個錯誤代碼也只是大小的數組1.
不幸的是,我對Web服務的結果沒有太多的控制。所以我不能改變這一點。 –
目前,我忽略了對象中的ErrorCode ...因爲這些信息在我的使用中並不那麼重要......並且它工作正常。 –
您可以創建一個類,如:
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) };
// ...
}
希望它有幫助。
您可以創建自定義的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>());
嘗試反序列化的錯誤代碼值轉換爲對象,檢查結果(即做出錯誤代碼。屬性是'object'類型的屬性)。 –