C# 使用DataContractJsonSerializer设置JSON对象根

C# 使用DataContractJsonSerializer设置JSON对象根,c#,.net,json,serialization,C#,.net,Json,Serialization,使用System.Runtime.Serialization.Json.DataContractJsonSerializer序列化对象时,是否有方法在Json字符串中设置“根”键或顶级键 例如,下面是一个类: [DataContract] public class Person { public Person() { } public Person(string firstname, string lastname) { this.FirstName =

使用
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;
}
有没有办法让序列化程序预先指定一些值

例如:

{Person: {"FirstName":"Jane","LastName":"McDoe"}}
当然,我可以简单地更改我的
Serialize
方法来包装返回的JSON字符串,例如:

string retVal = "{Person:" + Encoding.Default.GetString(ms.ToArray()) + "}";

但是我想知道是否有办法告诉序列化程序添加它?
DataContract
属性上的
namespace
属性似乎没有什么帮助。

您可以这样做,但它并不太漂亮-您需要了解
DataContractJsonSerializer
使用的一些规则。对于简单的情况,您只想用类型名包装对象,这相当简单——下面的代码就是这样做的。您需要使用所需的“root”名称创建序列化程序(在本例中,我使用了类型名称),并向其传递一个
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")));
    }
}
公共类堆栈溢出\u 7930629
{
[数据合同]
公共阶层人士
{
公众人物(){}
公众人物(字符串名、字符串名)
{
this.FirstName=FirstName;
this.LastName=LastName;
}
[数据成员]
公共字符串名{get;set;}
[数据成员]
公共字符串LastName{get;set;}
}
公共静态字符串序列化(T obj)
{
DataContractJsonSerializer序列化程序=
新的DataContractJsonSerializer(typeof(T),typeof(T).Name);
MemoryStream ms=新的MemoryStream();
XmlDictionaryWriter w=JsonReaderWriterFactory.CreateJsonWriter(ms);
w、 WriteStarteElement(“根”);
w、 WriteAttributeString(“类型”、“对象”);
serializer.WriteObject(w,obj);
w、 写删除();
w、 冲洗();
string retVal=Encoding.Default.GetString(ms.ToArray());
Dispose女士();
返回返回;
}
公共静态无效测试()
{
Console.WriteLine(连载(新人物(“简”、“麦克多”));
}
}

正如其中一条评论中提到的,使用JSON和
DataContractJsonSerializer
不是一件很友好的事情。一些特定于JSON的库,如JSON.NET或JsonValue类型(nuget package JsonValue),可以让您的生活更加轻松。

使用,使用JSON会让您的生活更加轻松;我发现开箱即用的.NET产品非常、非常缺乏。为什么要将其包装成这种类型?我觉得你的建议不太好。我会更进一步,只是做一个数组。{Persons:[Person]}事实上我正在处理一个CouchDB客户端。。当您通过CouchDB API添加一个对象(JSON)时,它希望该对象有一个标签。我也将查看JSON.NET。ThxI还注意到,其中一个序列化方法签名请求一个“XmlDictionaryString rootName”参数,但它似乎不起作用。。好的,现在转到JSON.NET
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")));
    }
}