2015-12-19 48 views
2

我將對象序列化爲JSON,但我沒有它的代碼(所以我不能在每個屬性上設置[JsonProperty(Order = x)]屬性)。設置從第三方對象序列化的JSON屬性的順序

我還需要僅指定某些要序列化的屬性。

以下代碼正在工作,但我還需要指定屬性的順序。

public class DynamicContractResolver : Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver 
{ 
    private IList<string> _propertiesToSerialize = null; 

    public DynamicContractResolver(IList<string> propertiesToSerialize) 
    { 
     _propertiesToSerialize = propertiesToSerialize; 
    } 

    protected override IList<JsonProperty> CreateProperties(Type type, Newtonsoft.Json.MemberSerialization memberSerialization) 
    { 
     IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization); //.OrderBy(p => p.Order).ToList(); 
     return properties.Where(p => _propertiesToSerialize.Contains(p.PropertyName)).ToList(); 
    } 
} 

//... 

List<string> propertiesToSerialize = new List<string>(new string[] 
{ 
    "name", 
    "masterString", 
    "cruiseMode", 
    "account" 
}); 

DynamicContractResolver contractResolver = new DynamicContractResolver(propertiesToSerialize); 

string json = Newtonsoft.Json.JsonConvert.SerializeObject(_objToSerialize, Newtonsoft.Json.Formatting.Indented, 
    new Newtonsoft.Json.JsonSerializerSettings { ContractResolver = contractResolver }); 

輸出是:

{ 
    "masterString": "Provider...", 
    "cruiseMode": 2, 
    "account": "xxx\yyy", 
    "name": "AdWorksName" 
} 

但我需要它是:

{ 
    "name": "AdWorksName", 
    "masterString": "Provider...", 
    "cruiseMode": 2, 
    "account": "xxx\yyy", 
} 

回答

1

儘管JSON spec技術上將對象定義爲「一組無名稱/值對」,但JSON.net仍然允許您設置屬性的順序(如果需要)。在解析器中,您只需在每個JsonProperty上設置Order值,然後按照相應的順序返回它們。

protected override IList<JsonProperty> CreateProperties(Type type, Newtonsoft.Json.MemberSerialization memberSerialization) 
{ 
    IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization) 
     .Where(p => _propertiesToSerialize.Contains(p.PropertyName)).ToList(); 

    foreach (JsonProperty prop in properties) 
    { 
     prop.Order = _propertiesToSerialize.IndexOf(prop.PropertyName) + 1; 
    } 

    return properties.OrderBy(p => p.Order).ToList(); 
} 

工作演示:https://dotnetfiddle.net/OhfWHl

+0

工作正常!還有這樣一個簡單的解決方案。感謝Brian! – bdog

+0

沒問題;樂意效勞。 –

0

屬性的順序是沒有意義,或保持在JSON,出於同樣的原因的順序的屬性不在XML中維護......或者在Javascript本身中維護。如果你想訂購,它必須被序列化爲一個列表。

+0

的示例代碼的任何指針序列化作爲一個列表? – bdog

相關問題