c# – 使用DataContractJsonSerializer设置JSON对象root
发布时间:2020-12-15 21:25:12 所属栏目:百科 来源:网络整理
导读:使用System.Runtime.Serialization.Json.DataContractJsonSerializer序列化对象时,有没有办法在 JSON字符串中设置“root”或顶级键? 例如,这是一个类: [DataContract]public class Person{ public Person() { } public Person(string firstname,string las
使用System.Runtime.Serialization.Json.DataContractJsonSerializer序列化对象时,有没有办法在
JSON字符串中设置“root”或顶级键?
例如,这是一个类: [DataContract] public class Person { public Person() { } public Person(string firstname,string lastname) { this.FirstName = firstname; this.LastName = lastname; } [DataMember] public string FirstName { get; set; } [DataMember] public string LastName { get; set; } } 当它使用…序列化时 public static string Serialize<T>(T obj) { Json.DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); MemoryStream ms = new MemoryStream(); serializer.WriteObject(ms,obj); string retVal = Encoding.Default.GetString(ms.ToArray()); ms.Dispose(); return retVal; } 生成的JSON字符串如下所示: {"FirstName":"Jane","LastName":"McDoe"} 有没有办法让序列化器前置一些值? 例如: {Person: {"FirstName":"Jane","LastName":"McDoe"}} 当然,我可以简单地更改我的Serialize方法来包装返回的JSON字符串,例如: string retVal = "{Person:" + Encoding.Default.GetString(ms.ToArray()) + "}"; 但我想知道是否有某种方法告诉序列化程序添加它? DataContract属性上的namespace属性似乎没有帮助. 解决方法
你可以这样做,但它不是太漂亮 – 你需要知道DataContractJsonSerializer使用的一些
JSON to XML mapping规则.对于简单的情况,你只想将对象包装在类型名称中,这很简单 – 下面的代码就是这样做的.您需要使用所需的“根”名称创建序列化程序(在本例中我使用了类型名称),并向其传递已赋予根元素的XmlDictionaryWriter实例.
public class StackOverflow_7930629 { [DataContract] public class Person { public Person() { } public Person(string firstname,string lastname) { this.FirstName = firstname; this.LastName = lastname; } [DataMember] public string FirstName { get; set; } [DataMember] public string LastName { get; set; } } public static string Serialize<T>(T obj) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T),typeof(T).Name); MemoryStream ms = new MemoryStream(); XmlDictionaryWriter w = JsonReaderWriterFactory.CreateJsonWriter(ms); w.WriteStartElement("root"); w.WriteAttributeString("type","object"); serializer.WriteObject(w,obj); w.WriteEndElement(); w.Flush(); string retVal = Encoding.Default.GetString(ms.ToArray()); ms.Dispose(); return retVal; } public static void Test() { Console.WriteLine(Serialize(new Person("Jane","McDoe"))); } } 正如其中一条评论中所提到的,使用JSON和DataContractJsonSerializer并不是太友好了.一些JSON特定的库(如JSON.NET或JsonValue类型(nuget包JsonValue))可以让您的生活更轻松. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |