我正在尝试使用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))]
但这也无济于事。有人可以建议吗?
答案 0 :(得分: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序列化为一个ParameterContainers数组,它将公开它们的值。