使用DataContractJsonSerializer设置JSON对象的根

本文关键字:对象 JSON DataContractJsonSerializer 设置 使用 | 更新日期: 2023-09-27 18:12:36

使用System.Runtime.Serialization.Json.DataContractJsonSerializer序列化对象时,是否有办法在JSON字符串中设置"根"或顶级键?

例如,下面是一个类:

[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()) + "}";

但是我想知道是否有某种方法可以告诉序列化器添加它?namespace属性对DataContract属性似乎没有帮助。

使用DataContractJsonSerializer设置JSON对象的根

您可以这样做,但这不是很漂亮—您需要了解DataContractJsonSerializer使用的一些JSON到XML映射规则。对于简单的情况,您只想用类型名称包装对象,这相当简单—下面的代码可以做到这一点。您需要使用您想要的"根"名称创建序列化器(在本例中,我使用类型名称),并向其传递一个已给定根元素的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)可以使您的工作更轻松。