2014-09-19 9 views
8

W moich obiektach POCO często dziedziczę z innych obiektów POCO. Kiedy serializuje obiekt POCO przy użyciu JSON.NET, kolejność właściwości zostaje zepsuta.Porządek właściwości zostaje pomieszany po serializacji JSON.NET

Powiedz, mam klasy osoba, która wygląda tak:

public class Person 
{ 
    public int Id {get; set;} 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

Następnie Mam klasy Employee, która dziedziczy z klasy Osoba:

public class Employee : Person 
{ 
    public int DepartmentId {get; set;} 
    public string Title {get; set;} 
} 

Kiedy serializacji klasy Employee, mój obiekt JSON wygląda następująco:

{ 
    "departmentId": 123, 
    "title": "Manager", 
    "id": 1234567, 
    "firstName": "John", 
    "lastName": "Smith" 
} 

dwa pytania:

  1. Czy kolejność właściwości obiektu JSON ma znaczenie?
  2. Nawet jeśli kolejność właściwości nie ma znaczenia, w jaki sposób można uzyskać poprawne właściwości właściwości, np. Najpierw chciałbym zobaczyć właściwości klasy Person, a następnie właściwości klasy Employee.

Dziękuję za pomoc.

Odpowiedz

13

1.) Nie, zamówienie nie ma znaczenia.

2.) Można użyć [JsonProperty (kolejność = x)] przypisują kontrolować kolejność:

public class Employee : Person 
{ 
    [JsonProperty(Order = 1)] 
    public int DepartmentId { get; set; } 

    [JsonProperty(Order = 1)] 
    public string Title { get; set; } 
} 

Od szybkiego testu, aby domyślnie 0, jest posortowana od niskiego do wysokiego, a właściwości o tej samej wartości zamówienia są sortowane w dowolnej kolejności.

+0

Dziękuję bardzo! – Sam

+0

jak używać do słownika? klasa publiczna CountryInfo { public string Name {get; zestaw; } public int IsEnabled {get; zestaw; } } publiczna klasa Kraje { publiczny słownik countriesInfo = new Dictionary (); } Chcę sortować według countriesInfo.Name? –

0

Faktycznie, ponieważ mój obiekt był już JObject, musiałem użyć następujące rozwiązanie:

public class SortedJObject : JObject 
{ 
    public SortedJObject(JObject other) 
    { 
     var pairs = new List<KeyValuePair<string, JToken>>(); 
     foreach (var pair in other) 
     { 
      pairs.Add(pair); 
     } 
     pairs.OrderBy(p => p.Key).ForEach(pair => this[pair.Key] = pair.Value); 
    } 
} 

a następnie używać go tak:

string serializedObj = JsonConvert.SerializeObject(new SortedJObject(dataObject));

Powiązane problemy