这里的关键是使用不同的类进行持久化,将从 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(); }
}
}