2011-10-28 27 views
4

使用System.Runtime.Serialization.Json.DataContractJsonSerializer序列化對象時,有沒有辦法在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()) + "}"; 

但如果有某種方式來告訴我想知道序列化程序添加它? DataContract屬性上的namespace屬性似乎沒有幫助。

+0

使用[JSON.NET](http://json.codeplex.com/),在使用JSON時,它會讓你的生活更加容易*我發現現成的.NET產品非常非常缺乏。 – casperOne

+0

你爲什麼要把它包裝在類型中?你提出的建議對我來說似乎不是很好的JSON。我只想更進一步,只是創建一個數組。 {Persons:[Person]} – Jamie

+0

其實我正在處理一個CouchDB客戶端..當你通過CouchDB API添加一個對象(JSON)時,它希望對象擁有一個標籤。我也會檢查出JSON.NET。 Thx – ZimSystem

回答

1

你可以這樣做,但它不是太漂亮 - 你需要知道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))可以使您的生活變得更加輕鬆。

相關問題