如何控制我的JSON输出中的属性顺序?


6

我有一个名为DataItem的类,它有三个属性:Id,DataValue和CreatedDateTime。这些属性按照从上到下的顺序在类中定义。这也是我希望看到我的JSON导出中的属性的顺序。问题是DataItem对象中的属性和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主要是为了被其他程序读取,而不是由人类读取。 15 2月. 122012-02-15 02:46:54

  0

@svick - 没有太多代码可以显示。无论相关与否,这就是我们所拥有的。我没有序列化任何东西以显示在那里。就订单而言,这正是我们想要的。看看WCF REST多项目模板,因为这基本上就是我们正在做的事情。 15 2月. 122012-02-15 03:26:07

+1

可能重复[WCF DataContract DataMember order?](http://stackoverflow.com/questions/3816478/wcf-datacontract-datamember-order) 25 6月. 152015-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

好的,简单的解决方案。谢谢! 16 2月. 122012-02-16 00:37:39

+1

上面的Class Name必须是[DataContract]。谢谢 17 5月. 162016-05-17 20:13:06


1

我不认为DataContractJsonSerializer和JSON.NET都支持字段顺序。

如果Object像只有3个字段一样简单,那么您可以自己构造JSON字符串。