繁体   English   中英

用JSON.NET反序列化枚举值数组

[英]Deserializing array of enum values wih JSON.NET

我正在尝试使用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类型(即,不是整数之类的原始类型,不是数组或List之类的集合类型)或字典类型(即,Dictionary)。 要强制JSON对象反序列化,请将JsonObjectAttribute添加到类型。 路径“ ResponseElements [0] .Parameters.Parameter”,第9行,位置21。

我尝试使用ItemConverterType属性指定应如何反序列化数组:

[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]

但这也无济于事。 有人可以建议吗?

您正在尝试将对象填充到数组中。 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数组,该数组将公开其值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM