2

我有 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")
        };
    }
4

2 回答 2

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) });
于 2018-05-09T01:56:29.417 回答
0

您可以尝试实现自定义 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

于 2013-06-11T20:28:41.837 回答