从JsonConverter运行默认的序列化逻辑 [英] Run default serialization logic from JsonConverter
问题描述
我有一个JsonConverter
,具体取决于实例的特定标志,
I have a JsonConverter
that, depending on an instance specific flag, needs to either
- 运行自定义序列化逻辑
- 运行默认的Json.NET序列化逻辑
如何从JsonConverter
运行默认的Json.NET序列化逻辑?
How can the default Json.NET serialization logic be ran from a JsonConverter
?
谢谢
推荐答案
这里是一个示例.说出要序列化的班级,像这样:
Here is an example. Say your class to serialize looks like this:
class Foo
{
public bool IsSpecial { get; set; }
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
}
IsSpecial
标志用于控制我们是在转换器中执行特殊操作还是让事物自然地序列化.您可以这样编写转换器:
The IsSpecial
flag is used to control whether we do something special in the converter or just let things serialize naturally. You can write your converter like this:
class FooConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(Foo).IsAssignableFrom(objectType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Foo foo = (Foo)value;
JObject jo;
if (foo.IsSpecial)
{
// special serialization logic based on instance-specific flag
jo = new JObject();
jo.Add("names", string.Join(", ", new string[] { foo.A, foo.B, foo.C }));
}
else
{
// normal serialization
jo = JObject.FromObject(foo);
}
jo.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后,要使用转换器,请将其实例传递给SerializeObject
方法(例如,在设置中). (请勿使用JsonConverter
属性装饰目标类,否则在进行序列化时将导致无限递归循环.)
Then, to use the converter, pass an instance of it to the SerializeObject
method (e.g. in the settings). (Do NOT decorate the target class with a JsonConverter
attribute, or this will result in an infinite recursive loop when you serialize.)
class Program
{
static void Main(string[] args)
{
List<Foo> foos = new List<Foo>
{
new Foo
{
A = "Moe",
B = "Larry",
C = "Curly",
IsSpecial = false
},
new Foo
{
A = "Huey",
B = "Dewey",
C = "Louie",
IsSpecial = true
},
};
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new FooConverter());
settings.Formatting = Formatting.Indented;
string json = JsonConvert.SerializeObject(foos, settings);
Console.WriteLine(json);
}
}
输出:
[
{
"IsSpecial": false,
"A": "Moe",
"B": "Larry",
"C": "Curly"
},
{
"names": "Huey, Dewey, Louie"
}
]
这篇关于从JsonConverter运行默认的序列化逻辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!