Come controllo l'ordine delle proprietà nel mio output JSON?


6

Ho una classe, denominata DataItem, con tre proprietà: Id, DataValue e CreatedDateTime. Le proprietà sono definite nella classe in questo ordine dall'alto al basso. Questo è anche l'ordine in cui mi piacerebbe vedere le proprietà nella mia esportazione JSON. Il problema è che le proprietà nell'oggetto DataItem e nell'esportazione JSON sono ordinate in ordine alfabetico. Sebbene non ci sia nulla di tecnicamente sbagliato in questo formato, è una questione di leggibilità. Come posso controllare l'ordine delle proprietà nell'esportazione JSON?

Ho verificato l'istanza del file di dati e le proprietà sono elencate in ordine alfabetico. Va bene, comprendo i potenziali problemi di usabilità di non ordinare le proprietà alfabetiche.

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

Questo metodo è nella mia implementazione del servizio e restituisce l'elenco di DataItems. Sto pensando che ho bisogno di fare qualcosa qui, ma non sono sicuro di cosa o come.

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

Perché ci stai mostrando un sacco di codice irrilevante e non mostri il codice che conta, cioè dove serializzi il tuo oggetto su JSON? Inoltre, perché l'ordine è importante per te? JSON è pensato principalmente per essere letto da altri programmi, non dagli umani. 15 feb. 122012-02-15 02:46:54

  0

@svick - Non c'è molto codice da mostrare. Che sia rilevante o meno, è quello che abbiamo. Non sto serializzando nulla, quindi niente da mostrare lì. Per quanto riguarda l'ordine, è proprio quello che vogliamo. Dai un'occhiata al modello multiprogetto di WCF REST dato che fondamentalmente è quello che stiamo facendo. 15 feb. 122012-02-15 03:26:07

+1

possibile duplicato di [ordine WCF DataContract DataMember?] (Http://stackoverflow.com/questions/3816478/wcf-datacontract-datamember-order) 25 giu. 152015-06-25 13:57:23

17

Il DataContractJsonSerializer prende in considerazione l'attributo DataMember che ha una proprietà Order. Puoi usarlo per dire al serializzatore l'ordine dei membri che vuoi serializzare.

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

Regolare l'ordine in base alle esigenze, ma generalmente è come si fa in WCF.

+1

Soluzione semplice e facile. Grazie! 16 feb. 122012-02-16 00:37:39

+1

[DataContract] sopra il nome della classe è obbligatorio. Grazie 17 mag. 162016-05-17 20:13:06


1

non credo sia DataContractJsonSerializer e JSON.NET supporta ordine dei campi.

È possibile costruire una stringa JSON autonomamente se Oggetto è semplice come avere solo 3 campi.