【问题标题】:Want to Serialization Json include [JsonIgnore] in sometimes有时想要序列化 ​​Json 中包含 [JsonIgnore]
【发布时间】:2013-06-07 18:19:04
【问题描述】:

我有 95% 不想序列化某些否定属性的类。所以我使用 [JsonIgnore] 属性和 Newtonsoft.Json,效果很好。

但是,我只有少数方法想要返回包含 [JsonIgnore] 中的属性的 JSON。我该怎么做?

谢谢大家

public class SubCatalog
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Catalog")]
    public int CatalogId { get; set; }
    public string Name { get; set; }

    [JsonIgnore]
    public virtual  Catalog Catalog { get; set; }
    [JsonIgnore]
    public virtual IList<Item> Items { get; set; }
}

通过这种方法,我想在实体中包含所有属性。

public HttpResponseMessage GetSubCatalogs(int id)
    {
        var list = _uow.SubCatalogs.GetByCatalogId(id);
        var json = JsonConvert.SerializeObject(list,
                                               Formatting.Indented,
                                               new JsonSerializerSettings
                                               {
                                                   ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                                               });

        return new HttpResponseMessage()
        {
            Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
        };
    }

【问题讨论】:

    标签: c# asp.net-mvc json serialization json.net


    【解决方案1】:

    您可以使用 IContractResolver

    public class IncludeIgnored : DefaultContractResolver
    {
        private readonly bool _includeIgnored;
    
        public IncludeIgnored(bool includeIgnored)
        {
            _includeIgnored = includeIgnored;
        }
    
        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
    
            foreach (var item in properties)
            {
                item.Ignored = !_includeIgnored;
            }
    
            return properties;
        }
    }
    

    然后当你调用你的序列化器时

    var serializedObject= JsonConvert.SerializeObject(myObject, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new IncludeIgnored(true) });
    

    【讨论】:

      【解决方案2】:

      你可以尝试实现自定义的JsonConverter。

      覆盖 WriteJson 方法并在那里实现自定义序列化。

      public class Converter : JsonConverter
      {
          public override bool CanRead { get { return false; } }
          public override bool CanWrite { get { return true; } }
      
      
          public override bool CanConvert(Type objectType)
          {
              return objectType == typeof(SubCatalog);
          }
      
          public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
          {
              throw new NotImplementedException();
          }
      
          public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
          {
                //serialization code here
          }
      }
      

      将此转换器的实例添加到序列化程序的Converters 属性或JsonSettings

      【讨论】:

        猜你喜欢
        • 2020-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2019-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多