1

在 Json.NET 中,如何在不受我控制的类(例如实体框架类)上指定元数据,例如要序列化哪些属性?

我可以发誓我已经读过一种方法,但我在文档中再也找不到它了。

如果我只是失明,请提前道歉。

4

1 回答 1

2

迟到的答复,但迟到总比没有好。

您可以使用 AutoMapper、ValueInjector 等将不受您控制的类映射到您创建/控制的类。然后您可以自由应用任何必要的属性。

编辑:使用IContractResolver的 JSON.NET 文档中的解决方案

public class DynamicContractResolver : DefaultContractResolver
{
  private readonly char _startingWithChar;
  public DynamicContractResolver(char startingWithChar)
  {
    _startingWithChar = startingWithChar;
  }

  protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
  {
    IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);

    // only serializer properties that start with the specified character
    properties =
      properties.Where(p => p.PropertyName.StartsWith(_startingWithChar.ToString())).ToList();

    return properties;
  }
}

public class Book
{
  public string BookName { get; set; }
  public decimal BookPrice { get; set; }
  public string AuthorName { get; set; }
  public int AuthorAge { get; set; }
  public string AuthorCountry { get; set; }
}

IContractResolver 示例

    Book book = new Book
{
  BookName = "The Gathering Storm",
  BookPrice = 16.19m,
  AuthorName = "Brandon Sanderson",
  AuthorAge = 34,
  AuthorCountry = "United States of America"
};

string startingWithA = JsonConvert.SerializeObject(book, Formatting.Indented,
  new JsonSerializerSettings { ContractResolver = new DynamicContractResolver('A') });

// {
//   "AuthorName": "Brandon Sanderson",
//   "AuthorAge": 34,
//   "AuthorCountry": "United States of America"
// }

string startingWithB = JsonConvert.SerializeObject(book, Formatting.Indented,
  new JsonSerializerSettings { ContractResolver = new DynamicContractResolver('B') });

// {
//   "BookName": "The Gathering Storm",
//   "BookPrice": 16.19
// }
于 2013-10-07T16:56:44.553 回答