我遇到了一个我不了解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对这两种情况进行不同的序列化吗?提前谢谢。
答案 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"
}
}