2012-05-22 63 views
1

我想使用JSON.NET反序列化來自第三方Web服務的響應。這是我的(人爲的)例子充分顯示代碼,我想要做的事:反序列化枚舉值的數組與JSON.NET

namespace JsonNetTests 
{ 
public enum Parameter 
{ 
    Alpha = 1, 
    Bravo = 2, 
    Charlie = 3, 
    Delta = 4 
} 

public class ResponseElement 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    [JsonProperty(ItemConverterType = typeof(StringEnumConverter))] 
    public Parameter[] Parameters { get; set; } 
} 

public class ResponseBody 
{ 
    public string Locale { get; set; } 
    public string[] Errors { get; set; } 
    public ResponseElement[] ResponseElements { get; set; } 
} 

[TestFixture] 
public class JsonNetTest 
{ 
    [Test] 
    public void TestEnumArray() 
    { 
     string jsonResponse = @" 
{""ResponseBody"": { 
""Locale"": ""en-US"", 
""Errors"": [], 
""ResponseElements"": [{ 
    ""Id"": 1, 
    ""Name"": ""ABC"", 
    ""Parameters"" : { 
     ""Parameter"" : ""Alpha"" 
    }, 
    }, { 
    ""Id"": 2, 
    ""Name"": ""BCD"", 
    ""Parameters"" : { 
     ""Parameter"" : ""Bravo"" 
    }, 
    } 
] 
}} 
"; 

     JObject rootObject = JObject.Parse(jsonResponse); 
     JToken rootToken = rootObject.SelectToken("ResponseBody"); 

     JsonSerializerSettings settings = new JsonSerializerSettings(); 
     settings.MissingMemberHandling = MissingMemberHandling.Error; 

     ResponseBody body = JsonConvert.DeserializeObject<ResponseBody>(rootToken.ToString(), settings); 

     foreach (var element in body.ResponseElements) 
     { 
      Console.WriteLine(string.Format("{0}: {1}", element.Id, element.Name)); 
      foreach (var parameter in element.Parameters) 
      { 
       Console.WriteLine(string.Format("\t{0}", parameter)); 
      } 
     } 
    } 
} 
} 

我得到以下異常:

Newtonsoft.Json.JsonSerializationException:無法反序列化JSON對象(即{ 「name」:「value」})轉換爲類型'JsonNetTests.Parameter []'。 反序列化類型應該是一個普通的.NET類型(即不是象整數這樣的原始類型,不是象數組或列表那樣的集合類型)或字典類型(即字典)。 要強制JSON對象反序列化,請將JsonObjectAttribute添加到類型中。路徑「ResponseElements [0] .Parameters.Parameter」,9號線,21位

我試圖用ItemConverterType屬性來指定數組應該如何deserialised:

[JsonProperty(ItemConverterType = typeof(StringEnumConverter))] 

但是,這並不能幫助無論是。有人可以建議嗎?

回答

0

你試圖將一個對象填充到一個數組中。 ResponseElement.Parameters是一個枚舉數組,在這裏你是json代碼使用一個對象來描述每個參數。

您的JSON看起來是這樣的:

// some json 
"Parameters" : { 
    "Parameter" : "Alpha" 
}, 
// more json 

但把它翻譯成枚舉數組就應該是這樣的:

// some json 
"Parameters" : [ "Alpha", "Bravo" ], 
// more json 

如果你不能改變的JSON,你可以改變你的模型,如下所示:

public enum ParameterEnum 
{ 
    Alpha = 1, 
    Bravo = 2 
} 

public ParameterContainer 
{ 
    [JsonProperty(ItemConverterType = typeof(StringEnumConverter))] 
    public ParameterEnum Parameter {get;set;} 
} 

public class ResponseElement 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public ParameterContainer[] Parameters { get; set; } 
} 

實際上,你會將json序列化爲一個ParameterContain數組這會暴露他們的價值。

+0

謝謝你的迴應!我試圖反序列化的類型不是我自己創建的。它是基於第三方的Web服務的WSDL自動生成的。他們同時提供SOAP和JSON版本的API,我想重用SOAP的Reference.cs中的類。 –

+0

我可以編寫自己的類去反序列化,但我試圖避免它,因爲第三方的類很龐大(根本不像我的簡化例子),它們有30多個屬性,其中大多數屬性都很複雜。有沒有什麼辦法可以在不改變JSON(不可能)或代理類的情況下實現反序列化,只需使用屬性(或者可以是自定義轉換器)? –

+0

哇。讓我想一想,我會回到你身邊。 –