【问题标题】:Deserializing a complex type but keep selected properties as serialized反序列化复杂类型,但将选定的属性保持为序列化
【发布时间】:2019-07-04 05:40:36
【问题描述】:

我将一个复杂的 json 对象反序列化为 POCO,然后使用 Microsoft.Azure.Cosmos.Table SDK 将数据存储到 Azure 表存储。但是,SDK 不支持插入复杂类型。我正在寻找一种方法来反序列化我的 json,以使复杂类型保持序列化,而仅反序列化简单类型。

这是我的类定义:

public class Person
{
   public string name {get; set;}
   public int department {get; set;}
   public List<Address> addresses {get; set;}
   public Skill skill {get; set;}
}

现在,我需要反序列化我的 json,以便 AddressesSkill 应保留为 string,但其他属性应反序列化.这将允许我将我的整个对象存储到 Azure 表存储,并显示地址和技能列。我知道 [JsonIgnore] 只会忽略我不需要的财产。

有什么办法可以做到吗?

【问题讨论】:

标签: c# json serialization json.net azure-table-storage


【解决方案1】:

这里的关键是使用不同的类进行持久化,将从 JSON 反序列化的类,我们将其命名为 PersistablePerson

我可以想到两种方法:

方法 1 - 使用自定义转换器

基于@dbc建议的another answer on SO,创建自定义转换器:

public class RawConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return reader.TokenType != JsonToken.Null
            ? JRaw.Create(reader).ToString()
            : null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteRawValue((string)value);
    }
}

持久化类看起来像这样:

public class PersistablePerson
{
    public string name {get; set;}
    public int department {get; set;}

    [JsonConverter(typeof(RawConverter))] 
    public string addresses {get; set;}

    [JsonConverter(typeof(RawConverter))] 
    public string skill {get; set;}
}

方法 2 - 使用双重属性

在持久化类中,将“复杂”属性加倍,这样每个这样的属性都由两个表示:

  • 字符串属性:包含在持久性中,被 JSON 序列化程序忽略
  • JToken 属性:由 JSON 序列化程序处理,从持久性中排除

JToken 属性设置器和获取器是读取和写入字符串属性的包装器。

public class PersistablePerson
{
    public string name {get; set;}
    public int department {get; set;}

    [JsonIgnore] // exclude from JSON serialization, include in persistence
    public string addresses {get; set;}

    [IgnoreProperty]            // exclude from persistence
    [JsonProperty("addresses")] // include in JSON serilization
    public JToken addressesJson
    {
        get { return addresses != null ? JToken.Parse(addresses) : null; }
        set { addresses = value.ToString(); }
    }

    [JsonIgnore] // exclude from JSON serialization, include in persistence
    public string skill {get; set;}

    [IgnoreProperty]        // exclude from persistence
    [JsonProperty("skill")] // include in JSON serilization
    public JToken skillJson
    {
        get { return skill != null ? JToken.Parse(skill) : null; }
        set { skill = value.ToString(); }
    }
}

【讨论】:

    猜你喜欢
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    相关资源
    最近更新 更多