给出以下代码段:
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
。我该怎么做?
答案 0 :(得分:6)
我通过检查来源找到了它。
有一个重载,允许您指定您传递的“根类型”。如果序列化程序发现您传递的类型不同(通过作为后代),它将写出类型名称。关键是指定System.Object
作为根类型,如下所示:
var serialized = JsonConvert.SerializeObject(demo, typeof(object), settings);