加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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))可以让您的生活更轻松.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读