C# 设置从第三方对象序列化的JSON属性的顺序

C# 设置从第三方对象序列化的JSON属性的顺序,c#,json,json.net,C#,Json,Json.net,我正在将对象序列化为JSON,但我不拥有其代码(因此我无法在每个属性上设置[JsonProperty(Order=x)]属性) 我还需要只指定要序列化的某些属性 下面的代码正在运行,但我还需要指定属性的顺序 public class DynamicContractResolver : Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver { private IList<string> _pro

我正在将对象序列化为JSON,但我不拥有其代码(因此我无法在每个属性上设置
[JsonProperty(Order=x)]
属性)

我还需要只指定要序列化的某些属性

下面的代码正在运行,但我还需要指定属性的顺序

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 });
但我需要的是:

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

属性的顺序在JSON中没有意义或没有维护,原因与XML中没有维护属性的顺序相同。。。或者Javascript本身。如果需要排序,则必须将其序列化为一个列表。

虽然从技术上讲,JSON.net将对象定义为“无序的名称/值对集”,但如果需要,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();
}
受保护的重写IList CreateProperties(类型为Newtonsoft.Json.MemberSerialization MemberSerialization)
{
IList properties=base.CreateProperties(类型,成员序列化)
.Where(p=>_propertiesToSerialize.Contains(p.PropertyName)).ToList();
foreach(属性中的JsonProperty属性)
{
prop.Order=propertiesToSerialize.IndexOf(prop.PropertyName)+1;
}
返回properties.OrderBy(p=>p.Order.ToList();
}

正在工作的演示:

成功了!这也是一个简单的解决方案。谢谢你,布莱恩!没问题;很乐意帮忙。
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();
}