我想使用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))]
但是,這並不能幫助無論是。有人可以建議嗎?
謝謝你的迴應!我試圖反序列化的類型不是我自己創建的。它是基於第三方的Web服務的WSDL自動生成的。他們同時提供SOAP和JSON版本的API,我想重用SOAP的Reference.cs中的類。 –
我可以編寫自己的類去反序列化,但我試圖避免它,因爲第三方的類很龐大(根本不像我的簡化例子),它們有30多個屬性,其中大多數屬性都很複雜。有沒有什麼辦法可以在不改變JSON(不可能)或代理類的情況下實現反序列化,只需使用屬性(或者可以是自定義轉換器)? –
哇。讓我想一想,我會回到你身邊。 –