首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将json反序列化为object:包装类解决方案

将json反序列化为object:包装类解决方案
EN

Stack Overflow用户
提问于 2015-08-24 14:07:14
回答 2查看 1.8K关注 0票数 4

这是我的儿子

代码语言:javascript
复制
{
    "accessType":"Grant",
    "spaces":[{"spaceId":"5c209ba0-e24d-450d-8f23-44a99e6ae415"}],
    "privilegeId":"db7cd037-6503-4dbf-8566-2cca4787119d",
    "privilegeName":"PERM_RVMC_DEV",
    "privilegeDescription":"RVMC Dev",
    "privilegeType":"Permission"
}

这是我的课:

代码语言:javascript
复制
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;
}

当空格数组不是null时,就会得到反序列化错误。我可以通过简单地为Guid创建一个包装类来解决这个问题。

代码语言:javascript
复制
public class Space
{
    public Guid spaceId;   
}

然后,我可以在我的特权类中使用一个List<Space>,而不是List<Space>,这一切都很好。但是我想知道是否有更好的方法来做到这一点,因为我不想有一个多余的包装类。那么,在不为我的特权类型对象编写自定义反序列化器的情况下,有什么简单的方法可以避免这种情况吗?

我正在用JSON.Net反序列化。

EN

Stack Overflow用户

回答已采纳

发布于 2015-08-27 06:37:00

您可以使用一个简单的JsonConverter类将spaces对象数组扁平化为GUID列表,从而消除对包装类的需求。

以下是转换器所需的代码:

代码语言:javascript
复制
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]属性:

代码语言:javascript
复制
public class ProfilePrivilege
{
    ...
    [JsonConverter(typeof(SpaceListConverter))]
    public List<Guid> Spaces;
    ...
}

然后,当你反序列化,一切都应该“只是工作”。

这里的完整演示:https://dotnetfiddle.net/EaYgbe

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32184375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档