可以为空的结构的JSON.NET序列化和TypeNameHandling.Auto

时间:2016-10-18 12:37:15

标签: c# json.net

以下计划:

using System;
using Newtonsoft.Json;

namespace JsonPlayground
{
    public class Program
    {
        private struct Message
        {
            public string Value { get; }

            [JsonConstructor]
            public Message(string value)
            {
                if (value == null) throw new ArgumentNullException(nameof(value));

                Value = value;
            }
        }

        private class ObjectWithOptionalMessage
        {
            public Message? Message { get; }

            public ObjectWithOptionalMessage(Message? message)
            {
                Message = message;
            }
        }

        public static void Main(string[] args)
        {
            var objWithMessage = new ObjectWithOptionalMessage(new Message("Hello!"));

            var serializerSettings = new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.Auto,
                Formatting = Formatting.Indented
            };

            Console.WriteLine(JsonConvert.SerializeObject(objWithMessage, serializerSettings));
        }
    }
}

给我以下输出:

{
  "Message": {
    "$type": "System.Nullable`1[[JsonPlayground.Program+Message, JsonPlayground]], System.Private.CoreLib",
    "Value": "Hello!"
  }
}

我想不出为什么$type应该被包含在明显是一个声明良好的财产中的原因。如果我声明Message属性不可为空,则不包括$type属性。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

DavidG的评论做了这个伎俩,所以要把它作为一个答案,应用JsonPropertyAttribute就像这样:

    private class ObjectWithOptionalMessage
    {
        [JsonProperty(TypeNameHandling = TypeNameHandling.None)]
        public Message? Message { get; }

        public ObjectWithOptionalMessage(Message? message)
        {
            Message = message;
        }
    }

似乎为我解决了这个问题。

答案 1 :(得分:0)

这是JSON.NET中的一个错误,报告here并使用this PR修复。