使用Json.Net序列化对象列表但不是单个对象时出现类型信息

时间:2018-04-24 11:21:14

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

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

我需要序列化对象才能将它们发布到API。使用具有某种层次结构的类型创建对象。因此在序列化方法中,基类型用于接收对象/对象,并使用配置了TypeNameHandling.Auto的Json.Net对其进行序列化。

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对这两种情况进行不同的序列化吗?提前谢谢。

1 个答案:

答案 0 :(得分:-2)

你可以将你的对象包裹在下面的

   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"
  }
}