反序列化复杂类型,但保留所选属性为序列化

时间:2019-07-04 05:40:36

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

我正在将复杂的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,以便地址技能应保留为字符串,但其他属性应反序列化。这将使我可以将我的整个对象存储到Azure Table存储中,并显示用于地址和技能的列。我知道[JsonIgnore]只会忽略我不需要的属性。

有什么办法可以做到吗?

1 个答案:

答案 0 :(得分:1)

这里的关键是使用不同的持久性类,该类将从JSON反序列化,我们将其命名为MockHttpServletRequest: HTTP Method = POST Request URI = /v1/address-service/internal/company/address Parameters = {} Headers = {Content-Type=[application/json]} Body = <no character encoding set> Session Attrs = {} Handler: Type = org.springframework.web.servlet.resource.ResourceHttpRequestHandler Async: Async started = false Async result = null Resolved Exception: Type = null ModelAndView: View name = null View = null Model = null FlashMap: Attributes = null MockHttpServletResponse: Status = 404 Error message = null Headers = {} Content type = null Body = Forwarded URL = null Redirected URL = null Cookies = [] java.lang.AssertionError: Status Expected :200 Actual :404

我可以想到两种方法:

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

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

PersistablePerson

持久性类如下:

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);
    }
}

方法2-使用双重属性

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

  • 字符串属性:包含在持久性中,被JSON序列化程序忽略
  • 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;} } 属性:由JSON序列化程序处理,不包含在持久性中

JToken属性设置器和getter是读取和写入string属性的包装器。

JToken