实际上,可以使用几种相当简单的方法来获得所需的结果。
例如,假设您当前定义了这样的类:
class Config{ public Fizz ObsoleteSetting { get; set; } public Bang ReplacementSetting { get; set; }}enum Fizz { Alpha, Beta, Gamma }class Bang{ public string Value { get; set; }}而您想这样做:
string json = @"{ ""ObsoleteSetting"" : ""Gamma"" }";// deserializeConfig config = JsonConvert.DeserializeObject<Config>(json);// migrateconfig.ReplacementSetting = new Bang { Value = config.ObsoleteSetting.ToString() };// serializejson = JsonConvert.SerializeObject(config);Console.WriteLine(json);为了得到这个:
{"ReplacementSetting":{"Value":"Gamma"}}方法1:添加ShouldSerialize方法
Json.NET可以通过
ShouldSerialize在类中查找相应的方法来有条件地序列化属性。
若要使用此功能,请
ShouldSerializeBlah()在您的类中添加一个布尔方法,该方法将
Blah替换为您不想序列化的属性的名称。使此方法的执行始终返回
false。
class Config{ public Fizz ObsoleteSetting { get; set; } public Bang ReplacementSetting { get; set; } public bool ShouldSerializeObsoleteSetting() { return false; }}注意:如果您喜欢这种方法,但又不想通过引入一种
ShouldSerialize方法弄混类的公共接口,则可以使用an
IContractResolver来以编程方式执行相同的操作。请参阅文档中的条件属性序列化。
方法2:使用JObjects处理JSON
无需使用
JsonConvert.SerializeObject序列化方法,
JObject只需将config对象加载到中,然后在将其写出之前从JSON中删除不需要的属性即可。这只是几行额外的代码。
JObject jo = JObject.FromObject(config);// remove the "ObsoleteSetting" JProperty from its parentjo["ObsoleteSetting"].Parent.Remove();json = jo.ToString();
方法3:巧妙(滥用)属性使用
- 将
[JsonIgnore]
属性应用于您不想序列化的属性。 - 向该类添加一个替代的 私有 属性设置器,其类型与原始属性相同。使该属性的实现设置为原始属性。
- 将
[JsonProperty]
属性应用于替代设置器,为其赋予与原始属性相同的JSON名称。
这是修改后的
Config类:
class Config{ [JsonIgnore] public Fizz ObsoleteSetting { get; set; } [JsonProperty("ObsoleteSetting")] private Fizz ObsoleteSettingAlternateSetter { // get is intentionally omitted here set { ObsoleteSetting = value; } } public Bang ReplacementSetting { get; set; }}


