简化Json实体进行反序列化



实际上我收到的Json是这样的:

{
    "id" : 1,
    "items": [
        {
            "media": {
                "id": 1,
            }
        },
        {
            "media": {
                "id": 2,
            },
        }
    ],
    "status": "ok"
}

我创建了这样的类来映射实体

public class Message
    {
        [JsonProperty("items")]
        public List<Item> Items { get; set; }
    }
    public class Item
    {
        [JsonProperty("media")]
        public Media Media { get; set; }
    }
    public class Media
    {
        [JsonProperty("id")]
        public string Id { get; set; }
    }

这个工作完美,但我的问题是:是否可以删除Item类并直接在List of Media中强制转换以简化?

更新:我很确定这是可能的,我在发布之前发现的第一种方法是JSonConverter,但我不确定是最好的方法,我想知道是否有更简单的解决方案,例如属性。

使用私有字典

,可以,例如使用(私有)Dictionary

public class Message
{
    public List<Media> Items { get; set; }
}
public class Media
{
    [JsonProperty("media")]
    private Dictionary<string, string> IdDict;
    public string Id
    {
        get { return IdDict["id"]; }
        set { IdDict["id"] = value; }
    }
}
使用

var result = JsonConvert.DeserializeObject<Message>(json);
var test = result.Items[1].Id;

实现转换器

或者您可以通过实现Converter

来实现您的结果
   public class MediaConverter : JsonCreationConverter<Message>
    {
        protected override Message Create(Type objectType, JObject jObject)
        {
            var msg = new Message();
            msg.Items = new List<Media>();
            foreach (var item in jObject["items"])
            {
                Media media = new Media();
                media.Id = item["media"]["id"].Value<string>();
                msg.Items.Add(media);
            }
            return msg;
        }
    }

    public abstract class JsonCreationConverter<T> : JsonConverter
    {
        protected abstract T Create(Type objectType, JObject jObject);
        public override bool CanConvert(Type objectType)
        {
            return typeof(T).IsAssignableFrom(objectType);
        }
        public override object ReadJson(JsonReader reader,
                                        Type objectType,
                                         object existingValue,
                                         JsonSerializer serializer)
        {
            // Load JObject from stream
            JObject jObject = JObject.Load(reader);
           // Create target object based on JObject
            T target = Create(objectType, jObject);
            return target;
        }
        public override void WriteJson(JsonWriter writer,
                                       object value,
                                       JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
使用

 var result = JsonConvert.DeserializeObject<Message>(json, new MediaConverter());
 var test = result.Items[1].Id;

最新更新