Как я могу контролировать порядок свойств в моем выходе 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 фев. 122012-02-15 02:46:54

  0

@svick - кода не так много. Является ли это актуальным или нет, это то, что у нас есть. Я не сериализую ничего, поэтому ничего не показывать. Что касается порядка, это то, что мы хотим. Взгляните на многопроектный шаблон WCF REST, поскольку это в основном то, что мы делаем. 15 фев. 122012-02-15 03:26:07

+1

Возможный дубликат [WCF DataContract DataMember order?] (Http://stackoverflow.com/questions/3816478/wcf-datacontract-datamember-order) 25 июн. 152015-06-25 13:57:23

17

DataContractJsonSerializer принимает во внимание атрибут DataMember, который имеет свойство Order. Вы можете использовать его, чтобы сообщить сериализатору порядок членов, которые вы хотите сериализовать.

[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 фев. 122012-02-16 00:37:39

+1

[DataContract] выше Имя класса обязательно. благодаря 17 май. 162016-05-17 20:13:06


1

Я не думаю, что оба DataContractJsonSerializer и JSON.NET поддерживают порядок полей.

Вы можете построить строку JSON самостоятельно, если Object так же просто, как просто наличие трех полей.