且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用Json.NET将嵌套的JSON反序列化为平面类

更新时间:2022-11-22 17:26:11

这是一种可能的方法-

internal class ConventionBasedConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(JiraIssue).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var daat = JObject.Load(reader);
        var ret = new JiraIssue();

        foreach (var prop in ret.GetType().GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance))
        {
            var attr = prop.GetCustomAttributes(false).FirstOrDefault();
            if (attr != null)
            {
                var propName = ((JsonPropertyAttribute)attr).PropertyName;
                if (!string.IsNullOrWhiteSpace(propName))
                {
                    var conventions = propName.Split('/');
                    if (conventions.Length == 3)
                    {
                        ret.Type = (string)((JValue)daat[conventions[0]][conventions[1]][conventions[2]]).Value;
                    }

                    ret.Id = Convert.ToInt32(((JValue)daat[propName]).Value);
                }                        
            }
        }


        return ret;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {

    }
}

var settings = new JsonSerializerSettings();
settings.Converters.Add(new ConventionBasedConverter());
var o = JsonConvert.DeserializeObject<JiraIssue>(s, settings);