繁体   English   中英

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

[英]Set the order of JSON properties serialized from a third-party object

我将对象序列化为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 });

输出是:

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

但我需要它:

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

尽管JSON规范在技术上将对象定义为“一组无序的名称/值对”,但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

属性的顺序没有意义或在JSON中维护,原因相同,属性的顺序不是在XML中保存的......或者在Javascript本身中。 如果您想要订购,则必须将其序列化为列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM