2012-02-15 54 views
6

我有一個名爲DataItem的類,它有三個屬性:Id,DataValue和CreatedDateTime。這些屬性按照從上到下的順序在類中定義。這也是我希望看到我的JSON導出中的屬性的順序。問題是DataItem對象中的屬性和JSON導出中的屬性按字母順序排序。儘管這種格式在技術上沒有任何問題,但這是一個可讀性問題。如何控制JSON導出中屬性的順序?如何控制我的JSON輸出中的屬性順序?

我檢查了dataItem wen實例化和屬性按字母順序列出。這沒關係,我瞭解不按字母排序屬性的潛在可用性問題。

public static List<DataItem>GetAllDataItems() 
     { 
      List<DataItem> dataItems = new List<DataItem>(); 

      SqlConnection conn = NetduinoDb.GetConnection(); 

      SqlCommand cmd = conn.CreateCommand(); 

      cmd.CommandText = "Select Id, DataValue, CreatedDateTime from XXX"; 
      cmd.CommandType = CommandType.Text; 

      conn.Open(); 

      SqlDataReader reader = cmd.ExecuteReader(); 

      while (reader.Read()) 
      { 
       DataItem dataItem = new DataItem 
       { 
        Id = reader["Id"].ToString(), 
        DataValue = reader["DataValue"].ToString(), 
        CreatedDateTime = reader["CreatedDateTime"].ToString() 
       }; 

       dataItems.Add(dataItem); 
      } 

      reader.Close(); 
      conn.Close(); 


      return dataItems.ToList(); 
     } 

此方法在我的服務實現中,並返回DataItems的列表。我想我需要在這裏做點什麼,但不知道是什麼或如何。

public List<DataItem> GetCollection() 
{ 
    return DataRetriever.GetAllDataItems(); 
} 
+0

爲什麼您向我們展示大量不相關的代碼,並且不顯示重要的代碼,即您將對象序列化到JSON的位置?另外,爲什麼命令對你很重要? JSON主要是爲了被其他程序讀取,而不是由人類讀取。 – svick 2012-02-15 02:46:54

+0

@svick - 沒有太多代碼可以顯示。無論相關與否,這就是我們所擁有的。我沒有序列化任何東西以顯示在那裏。就訂單而言,這正是我們想要的。看看WCF REST多項目模板,因爲這基本上就是我們正在做的事情。 – DenaliHardtail 2012-02-15 03:26:07

+1

可能重複[WCF DataContract DataMember order?](http://stackoverflow.com/questions/3816478/wcf-datacontract-datamember-order) – JNF 2015-06-25 13:57:23

回答

17

DataContractJsonSerializer考慮到具有Order屬性的DataMember屬性。您可以使用它來告訴序列化器您想要序列化的成員的順序。

[DataContract] 
class DataItem 
{ 
    [DataMember(Order = 1)] 
    public string Id { get; set; } 

    [DataMember(Order = 2)] 
    public string DataValue { get; set; } 

    [DataMember(Order = 3)] 
    public string CreatedDateTime { get; set; } 
} 

根據需要調整順序,但這通常是如何在WCF中完成的。

+1

好的,簡單的解決方案。謝謝! – DenaliHardtail 2012-02-16 00:37:39

+1

上面的Class Name必須是[DataContract]。謝謝 – Ashok 2016-05-17 20:13:06

1

我不認爲DataContractJsonSerializer和JSON.NET都支持字段順序。

如果Object像只有3個字段一樣簡單,那麼您可以自己構造JSON字符串。

相關問題