JSON.NET を使用して、サードパーティの Web サービスからの応答を逆シリアル化しようとしています。これは、私がやろうとしていることを示す私の(不自然な)例の完全なコードです:
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 属性を使用して、配列を逆シリアル化する方法を指定しようとしました。
[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
しかし、これも役に立ちません。誰かがアドバイスできますか?