当JSON.NET序列化时,属性顺序会搞乱

时间:2014-09-19 03:35:15

标签: c# json serialization json.net

在我的POCO对象中,我经常从其他POCO对象继承。当我使用JSON.NET序列化POCO对象时,属性的顺序全部搞砸了。

说,我有一个看起来像这样的Person类:

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

然后我有一个继承自Person类的Employee类:

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

当我序列化Employee类时,我的JSON对象如下所示:

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

两个问题:

  1. 我的JSON对象属性的顺序是否重要?
  2. 即使属性的顺序不重要,我怎样才能使属性处于正确的顺序,即我希望首先看到Person类属性,然后是Employee类属性。
  3. 感谢您的帮助。

2 个答案:

答案 0 :(得分:13)

1。)不,订单并不重要。

2.)您可以使用[JsonProperty(Order = x)]属性来控制订单:

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

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

从快速测试开始,订单默认为0,从低到高排序,具有相同Order值的属性按任意顺序排序。

答案 1 :(得分:0)

实际上,由于我的Object已经是一个JObject,我必须使用以下解决方案:

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

然后像这样使用它:

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