我可以在运行时使用JSON.Net的自定义序列化程序(删除属性)吗



我有一个需要序列化的对象,而这个对象内部有另一个对象,我需要对其属性进行筛选以删除一些属性。例如:

class inner {
    string baz = "hi";
    string blah = "hide me";
}
class outer {
    int foo = 7;
    inner bar = new inner();
}

我可以使用ContractResolver,但(据我所知)这需要单独序列化inner对象,这反过来显示为转义的JSON字符串,而不是outer对象的一部分,即:

{"foo":7,"bar":"{"baz":"hi"}"}

我需要的是:

{"foo":7,"bar":{"baz":"hi"}} // no blah property

我考虑过使用自定义JsonConverter,但不确定如何仅将该转换器用于inner对象,或者"通过"其他所有内容,仅在inner对象上运行我的自定义筛选。

我不能用属性(AFAIK)来做这件事,因为在其他地方我想序列化整个inner对象,而这是一个要么全有要么全无的设置。(除非我在运行时添加它?)此外,如果其他东西有blah属性,我不想删除它。。。仅来自CCD_ 8类型。

有办法做到这一点吗?

您可以使用自定义转换器。类似这样的东西:

    public class InnerSerializer : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(inner);
        }
        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)
        {
            var inner = value as inner;
            writer.WriteStartObject();
            writer.WritePropertyName("baz");
            writer.WriteValue(inner.baz);
            writer.WriteEndObject();
        }
    }

然后,如果您想使用它,请将它作为参数添加到SerializeObject:

string json = JsonConvert.SerializeObject(new outer(), new InnerSerializer());

我关于一直序列化json的解决方案是动态对象。我的意思是我没有上课。我正在为我的necessary字段创建动态对象,并序列化该动态对象。所以有时候我不需要类的所有字段,我只是把必要的字段放到动态对象中。这是一个非常简单的例子。

class inner 
{
   string baz = "hi";
   string blah = "hide me";
}
class outer 
{
   int foo = 7;
   inner bar = new inner();
}
dynamic dyn = new {
   foo = outer.foo,
   bar = inner
}
string json = JsonConvert.SerializeObject(dyn);

希望得到帮助。

相关内容

  • 没有找到相关文章

最新更新