繁体   English   中英

是否可以反序列化为属性而不是对象

[英]Is it possible to deserialize into property rather than an object

如果已经提出了要求,我找不到任何对我的情况有用的东西。

我需要在我的对象的属性而非整个对象的属性中反序列化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(){ }
}

我的杰森是:

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

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

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

由于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

希望这就是您想要的。

由于Wanted是“您所需的类”,因此需要在某个地方创建一个Wanted实例。 您也可以自己创建它,而不是使用解串器为您完成。 完成此操作后,您可以简单地将Users属性设置为反序列化数据:

var wanted = new Wanted() { Users = JsonConvert.DeSerialize<User[]>(myString) };

您无需先将某些数据反序列化为“属性”,而无需将其反序列化为某种类型的对象。 完成此操作后,您可以将属性设置为包含反序列化数据的对象。

但是,这里并没有通用的Wanted犯,并且除非您指定将数据反序列化到某个地方的类型,否则反序列化器不能假定它应该创建Wanted犯或任何其他类型。

如果您不知道数据与该类型匹配,则没有必要将数据反序列化为在编译时定义的类型。 然后,您还可以创建一个匿名对象或键/值对的字典。

您可以使用Newtonsoft.json。 试试下面

 var files = JArray.Parse(YourJSON);
 var recList = files.SelectTokens("$").ToList();
 foreach (JObject item in recList.Children())
  {
    foreach (JProperty prop in item.Children())
      {
         string key = prop.Name.ToString();
         string value = prop.Value.ToString();
        // and add these to an array
      }
  }

暂无
暂无

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

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