JSON.NET TypeNameHandling.Auto除了顶级

Dav*_*nde 4 c# json.net

给出以下代码段:

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除了根对象.我该怎么做呢?

Dav*_*nde 7

好吧,我通过检查来源找出了它.

有一个重载允许您指定您传递的"根类型".如果序列化程序发现您传递的类型不同(通过作为后代),它将写出类型名称.关键是指定System.Object为您的根类型,如下所示:

var serialized = JsonConvert.SerializeObject(demo, typeof(object), settings);
Run Code Online (Sandbox Code Playgroud)