将嵌套类反序列化为基本属性类型

时间:2016-10-31 16:09:02

标签: c# json json.net

我的样本json看起来像:

{
    "isError": false,
    "Status": 0,
    "Message": "The request processed successfully.",
    "Result": [
        {
            "EmployeeId": {
                "DisplayValue": "XX11"
            },
            "Title": {
                "DisplayValue": "M"
            },
            "FirstName": {
                "DisplayValue": "J"
            },
            "LastName": {
                "DisplayValue": "E"
            }
       }
    ]
}

我正在寻找一个设置或自定义转换器,将嵌套类折叠到各自的属性中。

public string EmployeeId {get; set;} 

因此,在上面的例子中,分配的值将是:“XX11”

我已经玩了一会儿,现在我需要一些帮助。

这是开箱即用支持还是你必须为它编写自定义转换器?

2 个答案:

答案 0 :(得分:1)

将你的json转换为class我得到了这个结构:

public class EmployeeId
    {
        public string DisplayValue { get; set; }
    }

    public class Title
    {
        public string DisplayValue { get; set; }
    }

    public class FirstName
    {
        public string DisplayValue { get; set; }
    }

    public class LastName
    {
        public string DisplayValue { get; set; }
    }

    public class Result
    {
        public EmployeeId EmployeeId { get; set; }
        public Title Title { get; set; }
        public FirstName FirstName { get; set; }
        public LastName LastName { get; set; }
    }

    public class RootObject
    {
        public bool isError { get; set; }
        public int Status { get; set; }
        public string Message { get; set; }
        public List<Result> Result { get; set; }
    }

要反序列化,您可以使用

var res1 = JsonConvert.DeserializeObject<RootObject>(json); // Newton.json dll
           JavaScriptSerializer js = new JavaScriptSerializer(); // System.Web.Script.Serialization
           var res2 = js.Deserialize<RootObject>(json);

答案 1 :(得分:1)

解决此问题的一种可能方法是编写一个JsonConverter来处理属性级别以展平&#34; DisplayValue&#34;反对它的价值。这实际上非常简单:

public class DisplayValueConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject obj = JObject.Load(reader);
        return (string)obj["DisplayValue"];
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

要使用转换器,您需要为[JsonConverter]类中的每个需要展平的属性添加Result属性。

public class RootObject
{
    public bool isError { get; set; }
    public int Status { get; set; }
    public string Message { get; set; }
    public List<Result> Result { get; set; }
}

public class Result
{
    [JsonConverter(typeof(DisplayValueConverter))]
    public string EmployeeId { get; set; }

    [JsonConverter(typeof(DisplayValueConverter))]
    public string Title { get; set; }

    [JsonConverter(typeof(DisplayValueConverter))]
    public string FirstName { get; set; }

    [JsonConverter(typeof(DisplayValueConverter))]
    public string LastName { get; set; }
}

然后,将JSON反序列化为RootObject类,它应该&#34;只是工作&#34;:

RootObject root = JsonConvert.DeserializeObject<RootObject>(json);

演示小提琴:https://dotnetfiddle.net/0L9sjl