JSON.NET TypeNameHandling.Auto除了顶级

时间:2015-10-27 11:17:53

标签: 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);
        }
    }
}

输出是这样的:

{
  "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。我该怎么做?

1 个答案:

答案 0 :(得分:6)

我通过检查来源找到了它。

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

var serialized = JsonConvert.SerializeObject(demo, typeof(object), settings);