首页 > 解决方案 > 是否可以反序列化为属性而不是对象

问题描述

如果它已经被问过,我找不到任何对我的情况有帮助的东西。

我需要反序列化对象属性中的 JSON,而不是整个对象。我尝试这样做的原因是,这只是泛型。

我有以下情况

例如我有

Class User 
{
   int UserId {get;set;}
   string Name {get;set;
}

Class Wanted : CustomClass
{
   User[] Users {get;set;}

   public override void Map(){ } 
   public override void Scan(){ }
}

我的Json是:

[
  {
    "userId": 1,
    "name": "Josh"
  },
  {
    "userId": 5,
    "name" : "Martin"
  }
]

是否可以将我的 JSON 直接反序列化(+泛型)到我的 Wanted 类中,而不是序列化为 A 然后将其分配给 Wanted ?

目标是在序列化之后,我将拥有 Wanted 类型的对象和一个包含 2 个用户的数组。

标签: c#.netjsonjson.net

解决方案


由于 JSON 与您要反序列化的类不匹配,并且您无法更改 JSON,因此您需要使用自定义JsonConverter来弥补差距。

为了使它工作,你需要引入一个IHasUsers你的Wanted类(或其基类)需要实现的接口:

interface IHasUsers
{
    User[] Users { get; set; }
}

class Wanted : CustomClass, IHasUsers
{
    public User[] Users { get; set; }
    ...
}

然后你可以制作一个通用转换器,它将实例化Wanted类(或任何其他实现的类IHasUsers)并填充Users属性:

class UserListConverter<T> : JsonConverter where T: IHasUsers, new()
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(IHasUsers).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JArray array = JArray.Load(reader);
        T obj = new T() { Users = array.ToObject<User[]>() };
        return obj;
    }

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

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

然后你可以像这样反序列化你的 JSON:

Wanted wanted = JsonConvert.DeserializeObject<Wanted>(json, new UserListConverter<Wanted>());

这是一个演示: https ://dotnetfiddle.net/KL6Ok6

希望这就是你要找的。


推荐阅读