Jak kontrolować kolejność właściwości w moim wyjściu JSON?


6

Mam klasy o nazwie DataItem, z trzema właściwościami: Id, DataValue i CreatedDateTime. Właściwości są zdefiniowane w klasie w tej kolejności od góry do dołu. To jest także kolejność, którą chciałbym zobaczyć właściwości w moim eksporcie JSON. Problemem są właściwości obiektu DataItem, a eksport JSON są sortowane w kolejności alfabetycznej. Chociaż nie ma nic złego pod względem technicznym w tym formacie, jest to kwestia czytelności. Jak kontrolować kolejność właściwości w eksporcie JSON?

Sprawdziłem element dataItem wen, a właściwości są wymienione w kolejności alfabetycznej. Jest to w porządku, rozumiem potencjalne problemy z użytecznością nie sortowania właściwości alfabetycznie.

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

Ta metoda jest w mojej implementacji usług i zwraca listę DataItems. Myślę, że muszę coś tu zrobić, ale nie wiem, co i jak.

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

Dlaczego pokazuje nam się dużo nieistotnego kodu i nie pokazuje kodu, który ma znaczenie, tj. W którym serializuje się obiekt do JSON? Dlaczego zamówienie ma dla Ciebie znaczenie? JSON jest przeznaczony przede wszystkim do czytania przez inne programy, nie przez ludzi. 15 lut. 122012-02-15 02:46:54

  0

@svick - Nie ma zbyt wiele kodu do wyświetlenia. Niezależnie od tego, czy jest to istotne, czy nie, właśnie to mamy. Nie serializuję niczego, więc nic do pokazania. Jeśli chodzi o zamówienie, to właśnie tego chcemy. Spójrz na Szablon Wielozadaniowy REST WCF, ponieważ w zasadzie to właśnie robimy. 15 lut. 122012-02-15 03:26:07

+1

możliwy duplikat [zamówienia WCF DataContract DataMember?] (Http://stackoverflow.com/questions/3816478/wcf-datacontract-datamember-order) 25 cze. 152015-06-25 13:57:23

17

Parametr DataContractJsonSerializer uwzględnia atrybut DataMember, który ma właściwość Order. Możesz go użyć do poinformowania serializatora o kolejności członków, które chcesz zserializować.

[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; } 
} 

Dostosuj kolejność w razie potrzeby, ale ogólnie jest tak, jak robi się to w WCF.

+1

Ładne i proste rozwiązanie. Dziękuję Ci! 16 lut. 122012-02-16 00:37:39

+1

[DataContract] powyżej Nazwa klasy jest obowiązkowa. Dzięki 17 maj. 162016-05-17 20:13:06


1

Nie sądzę, że zarówno DataContractJsonSerializer, jak i JSON.NET obsługują porządek w terenie.

Możesz skonstruować ciąg JSON samodzielnie, jeśli Obiekt jest tak prosty, jak tylko z 3 polami.