这是我的json
{
"accessType":"Grant",
"spaces":[{"spaceId":"5c209ba0-e24d-450d-8f23-44a99e6ae415"}],
"privilegeId":"db7cd037-6503-4dbf-8566-2cca4787119d",
"privilegeName":"PERM_RVMC_DEV",
"privilegeDescription":"RVMC Dev",
"privilegeType":"Permission"
}
这是我的班级:
public class ProfilePrivilege
{
public AccessType AccessType { get; set; }
public Guid PrivilegeId { get; set; }
public string PrivilegeName { get; set; }
public string PrivilegeDescription { get; set; }
public PrivilegeType PrivilegeType { get; set; }
public List<Guid> spaces;
}
当spaces数组不为null时,我得到一个反序列化错误。我可以通过简单地为Guid
创建一个包装类来解决这个问题public class Space
{
public Guid spaceId;
}
然后代替List<Guid>
我的Privilege类中可以有一个List<Space>
,一切都很好。但我想知道是否有更好的方法来做到这一点,因为我不想只为此而拥有一个冗余的包装类。那么有没有简单的方法可以解决这个问题,而无需为我的Privilege类型对象编写自定义反序列化器?
我正在使用JSON.Net btw进行反序列化。
答案 0 :(得分:1)
您可以使用简单的JsonConverter
类将spaces
对象数组展平为GUID列表,从而无需使用包装类。
以下是转换器所需的代码:
class SpaceListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(List<Guid>));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return JArray.Load(reader)
.Children<JObject>()
.Select(jo => Guid.Parse((string)jo["spaceId"]))
.ToList();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
要使用它,请在Spaces
班级中使用ProfilePrivilege
属性注释[JsonConverter]
属性,如下所示:
public class ProfilePrivilege
{
...
[JsonConverter(typeof(SpaceListConverter))]
public List<Guid> Spaces;
...
}
然后,当你反序列化时,一切都应该“正常工作”。
答案 1 :(得分:0)
您不一定需要创建POCO。另一种方法是使用动力学:
dynamic d = JObject.Parse(jsonString);
Console.WriteLine(d.accessType);
Console.WriteLine(d.spaces.Count);
Console.WriteLine(d.spaces[0].spaceId);