Serialization Newtonsoft Json.NET在运行时忽略Json转换器中的成员或调用JsonConverter序列化对象
假设我有以下用于序列化和/或反序列化的自定义JsonConverter:Serialization Newtonsoft Json.NET在运行时忽略Json转换器中的成员或调用JsonConverter序列化对象,serialization,json.net,deserialization,ignore,Serialization,Json.net,Deserialization,Ignore,假设我有以下用于序列化和/或反序列化的自定义JsonConverter: public class VersionConverter : JsonConverter<Version> { public override void WriteJson(JsonWriter writer, Version value, JsonSerializer serializer) { writer.WriteValue(value.ToString());
public class VersionConverter : JsonConverter<Version>
{
public override void WriteJson(JsonWriter writer, Version value, JsonSerializer serializer)
{
writer.WriteValue(value.ToString());
}
public override Version ReadJson(JsonReader reader, Type objectType, Version existingValue, bool hasExistingValue, JsonSerializer serializer)
{
string s = (string)reader.Value;
return new Version(s);
}
}
public class NuGetPackage
{
public string PackageId { get; set; }
public Version Version { get; set; }
public string Description { get; set; }
}
我希望Json.NET转换器忽略NuGetPackage类的Description成员变量
注意:我不想使用以下“marker boolean”成员变量:
public bool ShouldSerializeINSERT_YOUR_PROPERTY_NAME_HERE()
{
if(someCondition){
return true;
}else{
return false;
}
}
我宁愿指定忽略某个特定的成员变量
a) 当我的代码调用JsonConvert.Serialized对象时
b) 或者在VersionConverter代码类本身中
有人能告诉我如何以这种方式忽略特定的成员变量吗?由于
NuGetPackage
相当简单,您可以为NuGetPackage
编写一个额外的JsonConverter
,它只序列化您需要的成员,例如:
public class SimplifiedNuGetPackageConverter : JsonConverter
{
public override bool CanConvert(Type objectType) { return objectType == typeof(NuGetPackage); }
public override bool CanRead { get { return false; } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var package = (NuGetPackage)value;
serializer.Serialize(writer, new { package.PackageId, package.Version });
}
}
然后按如下方式序列化:
var settings = new JsonSerializerSettings
{
Converters = { new VersionConverter() },
};
if (!someCondition)
settings.Converters.Add(new SimplifiedNuGetPackageConverter());
var json = JsonConvert.SerializeObject(p1, Formatting.Indented, settings);
var settings = new JsonSerializerSettings
{
Converters = { new ConditionalNuGetPackageConverter(), new VersionConverter() },
};
var json = JsonConvert.SerializeObject(p1, Formatting.Indented, settings);
如果要同时序列化多个NuGetPackage
实例,并且需要为部分(而非全部)编写Description
,则可以在WriteJson()内部添加someCondition
的逻辑:
public class ConditionalNuGetPackageConverter : JsonConverter
{
public override bool CanConvert(Type objectType) { return objectType == typeof(NuGetPackage); }
public override bool CanRead { get { return false; } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var package = (NuGetPackage)value;
// Replace with your logic:
var someCondition = !string.IsNullOrWhiteSpace(package.Description);
if (someCondition)
serializer.Serialize(writer, new { package.PackageId, package.Version, package.Description });
else
serializer.Serialize(writer, new { package.PackageId, package.Version });
}
}
然后按如下方式序列化:
var settings = new JsonSerializerSettings
{
Converters = { new VersionConverter() },
};
if (!someCondition)
settings.Converters.Add(new SimplifiedNuGetPackageConverter());
var json = JsonConvert.SerializeObject(p1, Formatting.Indented, settings);
var settings = new JsonSerializerSettings
{
Converters = { new ConditionalNuGetPackageConverter(), new VersionConverter() },
};
var json = JsonConvert.SerializeObject(p1, Formatting.Indented, settings);
正在使用.Net FIDLE。您不能使numgetpackage.Description
从转换器中跳过numgetpackage.Version
。但是,如果NuGetPackage
像您展示的那样简单,您可以为它编写第二个转换器。(我假设您不能修改NuGetPackage
)您能否详细说明为NuGetPackage编写第二个转换器?请尽可能显示示例代码:)ThxNote-我没有使用JsonConverter
,只是因为它不支持Json.NET版本11。