2017-08-01 86 views
2

所以我用Json.net反序列化由的REST API返回到服務器的JSON數據,它返回的數據結構爲:未能desirialize異構JSON數據

{ "keyXXX" : [[1,2,3,...]...], "last": 12345 } 

的問題是「關鍵」的也是數據的一部分,它不是一個名爲「key」的字段,所以我不能使用類/結構體,我必須使用IDictionary<string, int[][]>作爲第一部分,但「最後」部分會拋出異常,因爲它是一個整數而不是數組數組。 這是我已經試過:

var dec = JsonConvert.DeserializeObject<IDictionary<string, int[][]>>(data); 

這將引發異常的JSON:

Newtonsoft.Json.JsonSerializationException:錯誤轉換值1501555920鍵入 'System.Decimal [] []'。路徑'最後'。

//define a class 
public class DPInfo 
{ 
    public decimal[][] points { get; set; } 
    public long last { get; set; } 
} 
var dec = JsonConvert.DeserializeObject<DPInfo>(data); 

這不會起作用,因爲數組的字段名稱是動態的,所以points將包含在此之後什麼都沒有。

任何方式我可以解決這個問題?

+0

在JSON中是否只有一個'keyXXX'或多個不同的'XXX'值? –

+0

只有一個,但它的名字各異 – fluter

回答

1

您將需要一個自定義JsonConverter來解決這個問題。這是一個應該工作:

public class DPInfoConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DPInfo); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JObject obj = JObject.Load(reader); 
     JProperty points = obj.Properties().FirstOrDefault(p => p.Name != "last"); 

     DPInfo info = new DPInfo 
     { 
      key = points.Name, // remove this line if you don't need the key 
      points = points.Value.ToObject<decimal[][]>(), 
      last = (long)obj["last"] 
     }; 

     return info; 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

要使用它,只是一個[JsonConverter]屬性添加到您的類:

[JsonConverter(typeof(DPInfoConverter))] 
public class DPInfo 
{ 
    public string key { get; set; } // remove this line if you don't need the key 
    public decimal[][] points { get; set; } 
    public long last { get; set; } 
} 

然後,反序列化和往常一樣,它應該工作:

string json = @" 
{ 
    ""keyXXX"": [[1, 2, 3]], 
    ""last"": 12345 
}"; 

DPInfo info = JsonConvert.DeserializeObject<DPInfo>(json); 

小提琴:https://dotnetfiddle.net/7S6STp

+0

這個作品完美,謝謝! – fluter

+0

沒問題;很高興我能幫上忙。 –

1

您可以使用JObject.Parse將您的字符串解析爲dynamic變量。它至少可以確保從字符串到JSON的轉換成功,但是在您訪問它之前,需要驗證每個屬性中是否有值。

在你的情況的聲明是這樣的:

dynamic data = JObject.Parse("{ 'keyXXX' : [[1,2,3,...]...], 'last': 12345 }");