当前位置:  开发笔记 > 编程语言 > 正文

IEnumerable的Json.Net序列化与TypeNameHandling = auto

如何解决《IEnumerable的Json.Net序列化与TypeNameHandling=auto》经验,为你挑选了0个好方法。

根据Json.Net文档,所有IEnumerable类型都应该序列化为json数组.

所以我期待以下课程:

public class MyClass
{
    public IEnumerable Values { get; set; }
}

被序列化为:

{
    "Values": []
}

问题是,当我使用时,TypeNameHandling=Auto我得到:

{
    "Values": {
        "$type": "System.String[], mscorlib",
        "$values": []
    }
}

我需要TypeNameHandling=Auto其他属性,但我希望IEnumerable使用默认序列化.其他类型(IList例如)按预期工作.

这是一个错误或我错过了什么?

这里是重现问题的完整代码:

    [Test]
    public void Newtonsoft_serialize_list_and_enumerable()
    {
        var target = new Newtonsoft.Json.JsonSerializer
        {
            TypeNameHandling = TypeNameHandling.Auto
        };

        var myEvent = new MyClass
        {
            Values = new string[0]
        };

        var builder = new StringWriter();
        target.Serialize(builder, myEvent);
        var json = JObject.Parse(builder.ToString());

        Assert.AreEqual(JTokenType.Array, json["Values"].Type);
    }

    public class MyClass
    {
        public IEnumerable Values { get; set; }
    }

我正在使用Newtonsoft 7.0.1.

更新:这里使用更多类型的另一个测试:

    [Test]
    public void Newtonsoft_serialize_list_and_enumerable()
    {
        var target = new Newtonsoft.Json.JsonSerializer
        {
            TypeNameHandling = TypeNameHandling.Auto
        };

        var myEvent = new MyClass
        {
            Values1 = new string[0],
            Values2 = new List(),
            Values3 = new string[0],
            Values4 = new List(),
            Values5 = new string[0]
        };

        var builder = new StringWriter();
        target.Serialize(builder, myEvent);
        var json = builder.ToString();
    }

    public class MyClass
    {
        public IEnumerable Values1 { get; set; }
        public IEnumerable Values2 { get; set; }
        public IList Values3 { get; set; }
        public IList Values4 { get; set; }
        public string[] Values5 { get; set; }
    }

这是结果:

{
    "Values1": {
        "$type": "System.String[], mscorlib",
        "$values": []
    },
    "Values2": [],
    "Values3": {
        "$type": "System.String[], mscorlib",
        "$values": []
    },
    "Values4": [],
    "Values5": []
}

我再次理解为什么根据组合得到不同的结果.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有