给定以下片段:
using System;
using Newtonsoft.Json;
namespace JsonTestje
{
class Other
{
public string Message2 { get; set; }
}
class Demo
{
public string Message { get; set; }
public Other Other { get; set; }
}
class Program
{
static void Main(string[] args)
{
var demo = new Demo
{
Message = "Hello, World!",
Other = new Other
{
Message2 = "Here be dragons!"
}
};
var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
Formatting = Formatting.Indented
};
var serialized = JsonConvert.SerializeObject(demo, settings);
Console.WriteLine(serialized);
}
}
}
输出是这样的:
{
"Message": "Hello, World!",
"Other": {
"Message2": "Here be dragons!"
}
}
现在,如果我将TypeNameHandling
更改为TypeNameHandling.All
,输出将变为:
{
"$type": "JsonTestje.Demo, JsonTestje",
"Message": "Hello, World!",
"Other": {
"$type": "JsonTestje.Other, JsonTestje",
"Message2": "Here be dragons!"
}
}
但我想要的是:
{
"$type": "JsonTestje.Demo, JsonTestje",
"Message": "Hello, World!",
"Other": {
"Message2": "Here be dragons!"
}
}
原因是我希望能够序列化一堆对象并在以后反序列化它们,而不知道它们反序列化为什么类型,但我也不想在不需要它们的地方到处使用这些$type
属性来污染内容。
换句话说,除了根对象之外,我想要TypeNameHandling.Auto
。我该怎么做?
我通过检查源代码找到了答案。
有一个重载允许您指定要传递的"根类型"。如果序列化程序发现您传递的类型不相同(作为子代),它将写出类型名称。关键是将System.Object
指定为根类型,如下所示:
var serialized = JsonConvert.SerializeObject(demo, typeof(object), settings);