JSON.NET TypeNameHandling.除顶级外为自动



给定以下片段:

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);

相关内容

  • 没有找到相关文章

最新更新