¿Cómo controlo el orden de las propiedades en mi salida JSON?


6

Tengo una clase, llamada DataItem, con tres propiedades: Id, DataValue y CreatedDateTime. Las propiedades se definen en la clase en ese orden de arriba a abajo. Este es también el orden en que me gustaría ver las propiedades en mi exportación JSON. El problema es que las propiedades en el objeto DataItem y en la exportación JSON están ordenadas en orden alfabético. Aunque no hay nada técnicamente incorrecto en este formato, es cuestión de legibilidad. ¿Cómo controlo el orden de las propiedades en la exportación JSON?

Revisé el dataItem donde se crearon las instancias y las propiedades se enumeran en orden alfabético. Esto está bien, entiendo los posibles problemas de usabilidad de no ordenar las propiedades alfabéticamente.

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

Este método se encuentra en la implementación de mi servicio y devuelve la lista de elementos de datos. Estoy pensando que necesito hacer algo aquí pero no estoy seguro de qué o cómo.

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

¿Por qué nos muestra un montón de código irrelevante y no muestra el código que importa, es decir, dónde serializa su objeto a JSON? Además, ¿por qué te importa el orden? JSON está destinado principalmente a ser leído por otros programas, no por humanos. 15 feb. 122012-02-15 02:46:54

  0

@svick - No hay mucho código para mostrar. Ya sea relevante o no, eso es lo que tenemos. No estoy serializando nada, así que no hay nada que mostrar allí. En cuanto al orden, eso es justo lo que queremos. Eche un vistazo a la plantilla de múltiples proyectos WCF REST ya que básicamente es lo que estamos haciendo. 15 feb. 122012-02-15 03:26:07

+1

posible duplicado de [¿Orden de WCF DataContre DataMember?] (Http://stackoverflow.com/questions/3816478/wcf-datacontract-datamember-order) 25 jun. 152015-06-25 13:57:23

17

El DataContractJsonSerializer tiene en cuenta el atributo DataMember que tiene una propiedad Order. Puede usarlo para decirle al serializador el orden de los miembros que desea serializar.

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

Ajuste el orden según sea necesario, pero esto es generalmente lo que se hace en WCF.

+1

Solución agradable y fácil. ¡Gracias! 16 feb. 122012-02-16 00:37:39

+1

[DataContract] arriba El nombre de la clase es obligatorio. Gracias 17 may. 162016-05-17 20:13:06


1

No creo que DataContractJsonSerializer y JSON.NET admitan el orden de los campos.

Puede construir cadena JSON usted mismo si Object es tan simple como tener solo 3 campos.