给出以下代码段:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
{
"Message": "Hello, World!",
"Other": {
"Message2": "Here be dragons!"
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我TypeNameHandling改为TypeNameHandling.All,输出变为:
{
"$type": "JsonTestje.Demo, JsonTestje",
"Message": "Hello, World!",
"Other": {
"$type": "JsonTestje.Other, JsonTestje",
"Message2": "Here be dragons!"
}
}
Run Code Online (Sandbox Code Playgroud)
但我想要的是这个:
{
"$type": "JsonTestje.Demo, JsonTestje",
"Message": "Hello, World!",
"Other": {
"Message2": "Here be dragons!"
}
}
Run Code Online (Sandbox Code Playgroud)
原因是我希望能够序列化一堆对象并在以后反序列化它们,而不知道它们反序列化的类型,但我也不希望$type在它们所在的地方污染具有这些属性的内容.不需要.
换句话说,我想要TypeNameHandling.Auto除了根对象.我该怎么做呢?
好吧,我通过检查来源找出了它.
有一个重载允许您指定您传递的"根类型".如果序列化程序发现您传递的类型不同(通过作为后代),它将写出类型名称.关键是指定System.Object为您的根类型,如下所示:
var serialized = JsonConvert.SerializeObject(demo, typeof(object), settings);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
915 次 |
| 最近记录: |