【问题标题】:How do I control the order of properties in my JSON output?如何控制 JSON 输出中的属性顺序?
【发布时间】:2012-02-15 02:36:21
【问题描述】:

我有一个名为 DataItem 的类,它具有三个属性:Id、DataValue 和 CreatedDateTime。属性在类中按从上到下的顺序定义。这也是我希望在我的 JSON 导出中查看属性的顺序。问题是 DataItem 对象和 JSON 导出中的属性按字母顺序排序。虽然这种格式在技术上没有问题,但它是可读性的问题。如何控制 JSON 导出中的属性顺序?

我检查了实例化的数据项,属性按字母顺序列出。没关系,我了解不按字母顺序对属性进行排序的潜在可用性问题。

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();
}

【问题讨论】:

  • 为什么你向我们展示了很多不相关的代码,却没有展示重要的代码,即你在哪里将你的对象序列化为 JSON?另外,为什么顺序对你很重要? JSON 主要是供其他程序读取,而不是人类。
  • @svick - 没有太多代码可以展示。不管它是否相关,这就是我们所拥有的。我没有序列化任何东西,所以没有什么可以显示的。至于顺序,这正是我们想要的。看看 WCF REST 多项目模板,因为这基本上就是我们正在做的事情。

标签: c# wcf json .net-4.0


【解决方案1】:

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 中的完成方式。

【讨论】:

  • 不错,简单的解决方案。谢谢!
  • [DataContract] 上面的类名是必须的。谢谢
【解决方案2】:

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

如果 Object 简单到只有 3 个字段,你可以自己构造 JSON 字符串。

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多