JSON 출력의 속성 순서를 어떻게 제어합니까?


6

Id, DataValue 및 CreatedDateTime의 세 가지 속성이있는 DataItem이라는 클래스가 있습니다. 속성은 위에서 아래로 순서대로 클래스에 정의됩니다. 이것은 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(); 
} 
  0

왜 많은 관련성없는 코드를 표시하고 중요한 코드 (예 : JSON으로 개체를 직렬화하는 위치)를 표시하지 않는 이유는 무엇입니까? 또한, 주문은 왜 당신에게 중요한가? JSON은 주로 사람이 아닌 다른 프로그램에서 읽어야합니다. 15 feb. 122012-02-15 02:46:54

  0

@svick - 표시 할 코드가 많지 않습니다. 관련성 여부에 상관없이 우리가 가진 것입니다. 나는 거기에 보여줄 것이 아무 것도 연재하지 않을 것이다. 주문과 관련해서는 그것이 우리가 원하는 것입니다. 기본적으로 WCF REST 다중 프로젝트 템플릿을 살펴보십시오. 15 feb. 122012-02-15 03:26:07

+1

가능한 중복 [WCF DataContract DataMember 주문?] (http://stackoverflow.com/questions/3816478/wcf-datacontract-datamember-order) 25 jun. 152015-06-25 13:57:23

17

DataContractJsonSerializerOrder 속성을 갖는 DataMember 속성을 고려합니다. serializer에 직렬화하려는 멤버의 순서를 알리는 데 사용할 수 있습니다.

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

+1

위의 [DataContract] 클래스 이름은 필수입니다. 감사 17 may. 162016-05-17 20:13:06


1

DataContractJsonSerializer와 JSON.NET이 필드 순서를 지원하지 않는다고 생각합니다.

Object가 3 개의 필드만으로 간단 할 경우 JSON 문자열을 직접 구성 할 수 있습니다.