使用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()) + "}";
解决方法
你可以这样做,但它不是太漂亮 – 你需要知道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))可以让您的生活更轻松.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。