簡體   English   中英

將json反序列化為object:包裝類解決方法

[英]Deserializing json into object: wrapper class workaround

這是我的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進行反序列化。

您可以使用簡單的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();
    }
}

要使用它,請使用[JsonConverter]屬性注釋ProfilePrivilege類中的Spaces屬性,如下所示:

public class ProfilePrivilege
{
    ...
    [JsonConverter(typeof(SpaceListConverter))]
    public List<Guid> Spaces;
    ...
}

然后,當你反序列化時,一切都應該“正常工作”。

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

您不一定需要創建POCO。 另一種方法是使用動力學:

dynamic d = JObject.Parse(jsonString);

Console.WriteLine(d.accessType);
Console.WriteLine(d.spaces.Count);
Console.WriteLine(d.spaces[0].spaceId);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM