如何根据父类类型有选择地从序列化中排除属性

布兰卡姆

我正在使用Newtonsoft.JSON库来序列化多个对象。在某些情况下,我不想序列化属性,因此我使用了ShouldSerialize前缀,该前缀在大多数情况下已大获成功。在一种情况下,我只想序列化属性(如果它属于特定类)。

我已经尝试过使用堆栈跟踪,但是它只告诉我JSON对象正在调用ShouldSerialize方法。我不需要知道应该调用ShouldSerialize的信息,我不需要知道ShouldSerialize属于哪个父类,例如Parent.Child.ShouldSerialize。

在下面的代码示例中,如何在使用JSON对象时确定父类名称是什么?

class Foo
{
    public SharedClass SomeProperty
    {
           get;
           set;
    }
}

class Bar
{
    public SharedClass SomeProperty
    {
           get;
           set;
    }
}

class SharedClass
{
    public string SomeValue
    {
           get;
           set;
    }

    public bool ShouldSerializeSomeValue
    {
           //pseudo logic
           return ClassName == "Foo";
    }
}
布赖恩·罗杰斯

正如Lasse Karlsen在评论中所指出的那样,如果您SharedClass没有对其父级的引用,则ShouldSerializeSomeValue()该类中方法将无法知道父级是什么。

但是,如果您使用的是Json.Net 6.0 Release 6或更高版本,则可以通过使用自定义JsonConverter方法来解决此问题,该方法是从共享类中有选择地省略属性(而不是使用ShouldSerialize()方法),然后将[JsonConverter]属性放在SharedClass属性上在适当的父类中指示要为该实例省略哪些属性。

这是更新后的示例类定义的外观。您会注意到,我已将SharedClass实例标记为打开,Foo以指示它应使用称为OmitPropertiesConverter忽略SomeValue属性的自定义转换器上的SharedClass实例Bar不使用转换器,因此该实例将被正常序列化。

class Foo
{
    [JsonConverter(typeof(OmitPropertiesConverter), "SomeValue")]
    public SharedClass Shared { get; set; }
}

class Bar
{
    public SharedClass Shared { get; set; }
}

class SharedClass
{
    public string SomeValue { get; set; }
    public string SomeOtherValue { get; set; }
}

以下是的代码OmitPropertiesConverter它的构造函数接受一个propsToOmit字符串,字符串是一个逗号分隔的属性名称列表,要从序列化中排除。这将拆分为一个数组,以供以后在该WriteJson方法中使用WriteJson方法采用的SharedClass值,将其转换为一个JObject,然后以编程除去它们是在属性propsToOmit阵列写入之前JObjectJsonWriter

class OmitPropertiesConverter : JsonConverter
{
    string[] propsToOmit;

    public OmitPropertiesConverter(string propsToOmit)
    {
        this.propsToOmit = propsToOmit.Split(new char[] {','},
                                             StringSplitOptions.RemoveEmptyEntries);
    }

    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(SharedClass));
    }

    public override void WriteJson(JsonWriter writer, object value, 
                                   JsonSerializer serializer)
    {
        JObject jo = JObject.FromObject(value, serializer);

        // Note: ToList() is needed here to prevent "collection was modified" error
        foreach (JProperty prop in jo.Properties()
                                     .Where(p => propsToOmit.Contains(p.Name))
                                     .ToList())
        {
            prop.Remove();
        }

        jo.WriteTo(writer);
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override object ReadJson(JsonReader reader, Type objectType,
                                    object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

这是一个简单的演示程序,显示了运行中的转换器:

class Program
{
    static void Main(string[] args)
    {
        var root = new
        {
            Foo = new Foo
            {
                Shared = new SharedClass
                {
                    SomeValue = "foo1",
                    SomeOtherValue = "foo2"
                }
            },
            Bar = new Bar
            {
                Shared = new SharedClass
                {
                    SomeValue = "bar1",
                    SomeOtherValue = "bar2"
                }
            }
        };

        string json = JsonConvert.SerializeObject(root, Formatting.Indented);
        Console.WriteLine(json);
    }
}

这是上述演示的输出。您会注意到,实例内部SomeValue属性未包含在输出中,但包含在内的实例中SharedClassFooBar

{
  "Foo": {
    "Shared": {
      "SomeOtherValue": "foo2"
    }
  },
  "Bar": {
    "Shared": {
      "SomeValue": "bar1",
      "SomeOtherValue": "bar2"
    }
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从JSON序列化中排除特定类型

来自分类Dev

如何在父类中指定类型时使Jackson类中没有类型属性的子类反序列化

来自分类Dev

序列化为XML时如何有选择地排除类成员

来自分类Dev

Spring Rest动态地从序列化中排除对象属性

来自分类Dev

从Spring安全会话序列化中排除属性?

来自分类Dev

在JMS序列化器中排除空属性

来自分类Dev

从Spring安全会话序列化中排除属性?

来自分类Dev

从Newtonsoft.Json的序列化中排除类的所有实例

来自分类Dev

如何从XML序列化程序集中排除一个类

来自分类Dev

如何使用JsonConverter从System.Text.Json.JsonSerializer.Serialize()中排除要序列化的属性

来自分类Dev

JSON.NET:如何根据父(所有者)对象值反序列化接口属性?

来自分类Dev

JSON.NET:如何根据父(所有者)对象值反序列化接口属性?

来自分类Dev

JSON.NET:如何根据父(所有者)对象值反序列化接口属性?

来自分类Dev

如何有选择地从Gemfile中排除gem pg?

来自分类Dev

在另一个类的序列化过程中排除一个类的某些属性(将其聚合)

来自分类Dev

从Json数据中排除属性而无需反序列化

来自分类Dev

有选择地将实例的属性序列化为 JSON

来自分类Dev

Protobuf-net序列化父类的继承对象属性标记为[ProtoIgnore()],引发“未为类型定义序列化器:System.Object”

来自分类Dev

Protobuf-net序列化父类的继承对象属性标记为[ProtoIgnore()],引发“未为类型定义序列化器:System.Object”

来自分类Dev

有没有办法根据属性有条件地序列化 C# 列表对象?

来自分类Dev

有条件地忽略属性序列化

来自分类Dev

如何反序列化xml父根属性

来自分类Dev

活动模型序列化器-如何有条件地包含属性?滑轨

来自分类Dev

有条件地序列化/反序列化属性

来自分类Dev

从Django Rest Framework序列化器中排除字段

来自分类Dev

在 django 序列化程序中排除嵌套模型字段

来自分类Dev

如何使用 NewtonSoft Json 反序列化为具有可变类型属性的类?

来自分类Dev

Django序列化父类

来自分类Dev

防止父类Java的序列化

Related 相关文章

  1. 1

    如何从JSON序列化中排除特定类型

  2. 2

    如何在父类中指定类型时使Jackson类中没有类型属性的子类反序列化

  3. 3

    序列化为XML时如何有选择地排除类成员

  4. 4

    Spring Rest动态地从序列化中排除对象属性

  5. 5

    从Spring安全会话序列化中排除属性?

  6. 6

    在JMS序列化器中排除空属性

  7. 7

    从Spring安全会话序列化中排除属性?

  8. 8

    从Newtonsoft.Json的序列化中排除类的所有实例

  9. 9

    如何从XML序列化程序集中排除一个类

  10. 10

    如何使用JsonConverter从System.Text.Json.JsonSerializer.Serialize()中排除要序列化的属性

  11. 11

    JSON.NET:如何根据父(所有者)对象值反序列化接口属性?

  12. 12

    JSON.NET:如何根据父(所有者)对象值反序列化接口属性?

  13. 13

    JSON.NET:如何根据父(所有者)对象值反序列化接口属性?

  14. 14

    如何有选择地从Gemfile中排除gem pg?

  15. 15

    在另一个类的序列化过程中排除一个类的某些属性(将其聚合)

  16. 16

    从Json数据中排除属性而无需反序列化

  17. 17

    有选择地将实例的属性序列化为 JSON

  18. 18

    Protobuf-net序列化父类的继承对象属性标记为[ProtoIgnore()],引发“未为类型定义序列化器:System.Object”

  19. 19

    Protobuf-net序列化父类的继承对象属性标记为[ProtoIgnore()],引发“未为类型定义序列化器:System.Object”

  20. 20

    有没有办法根据属性有条件地序列化 C# 列表对象?

  21. 21

    有条件地忽略属性序列化

  22. 22

    如何反序列化xml父根属性

  23. 23

    活动模型序列化器-如何有条件地包含属性?滑轨

  24. 24

    有条件地序列化/反序列化属性

  25. 25

    从Django Rest Framework序列化器中排除字段

  26. 26

    在 django 序列化程序中排除嵌套模型字段

  27. 27

    如何使用 NewtonSoft Json 反序列化为具有可变类型属性的类?

  28. 28

    Django序列化父类

  29. 29

    防止父类Java的序列化

热门标签

归档