[英]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.