【问题标题】:Type information appears when serializing list of objects but not single object using Json.Net [duplicate]使用 Json.Net 序列化对象列表而不是单个对象时出现类型信息 [重复]
【发布时间】:2018-04-25 02:25:01
【问题描述】:

我遇到了一个关于 Json.Net 的我不理解的有趣场景。

我需要序列化对象以便将它们发布到 API。对象是使用具有某种层次结构的类型创建的。所以在序列化方法中,基本类型用于接收对象/对象并使用 Json.Net 和 TypeNameHandling.Auto 进行序列化。

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace SerializationTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var dj = new Dj() { Name = "Tim", Label = "UMG", StageName = "Avicii" };
            var djJson = JSerializer.Serialize(dj);

            var djs = new List<Person>();
            djs.Add(dj);
            var djsJson = JSerializer.Serialize(djs);

            Console.ReadKey();
        }
    }

    public static class JSerializer
    {
        public static string Serialize(Person person)
        {
            var result = JsonConvert.SerializeObject(person, Formatting.Indented, new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.Auto
            });

            return result;
        }

        public static string Serialize(IReadOnlyList<Person> people)
        {
            var eventModelsSerialized = JsonConvert.SerializeObject(people, Formatting.Indented,
                new JsonSerializerSettings
                {
                    TypeNameHandling = TypeNameHandling.Auto
                });

            return eventModelsSerialized;
        }
    }

    public abstract class Person
    {
        public string Name { get; set; }
    }

    public abstract class Artist : Person
    {
        public string Label { get; set; }
    }

    public class Dj : Artist
    {
        public string StageName { get; set; }
    }
}

然后发生的事情是: 对于单对象序列化案例,我得到了非常基本的 Json,没有任何类型信息:

   {
      "StageName": "Avicii",
      "Label": "UMG",
      "Name": "Tim"
    }

而对于对象序列化的列表,我们得到了带有类型信息的 Json:

[
  {
    "$type": "SerializationTest.Dj, SerializationTest",
    "StageName": "Avicii",
    "Label": "UMG",
    "Name": "Tim"
  }
]

这会给服务器端造成混乱。因此,当我只想序列化单个对象时,由于缺少类型信息,服务器端无法对其进行序列化。所以解决方法是创建一个列表来包含对象并序列化为列表。

谁能解释为什么 Json.Net 对这两种情况进行不同的序列化?提前致谢。

【问题讨论】:

标签: c# .net json serialization json.net


【解决方案1】:

您可以如下所示包装您的对象

   var dj = new Dj() { Name = "Tim", Label = "UMG", StageName = "Avicii" };
    var obj = new 
    {
        Dj = dj
    };

            var eventModelsSerialized = JsonConvert.SerializeObject(obj, Formatting.Indented,
               new JsonSerializerSettings
               {
                   TypeNameHandling = TypeNameHandling.Auto
               });

带有类型信息的结果:

{
  "Dj": {
    "StageName": "Avicii",
    "Label": "UMG",
    "Name": "Tim"
  }
}

【讨论】:

  • 这不是类型信息,而是您创建的更高级别对象的属性信息。名称可以是任何东西,也可以添加自定义字段或其他方法,但标准 json 解析器不会遵循这种技巧,也无法反序列化它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
相关资源
最近更新 更多