【问题标题】:How to use ShouldSerialize[MemberName]() method for a property of type Object?如何对 Object 类型的属性使用 ShouldSerialize[MemberName]() 方法?
【发布时间】:2013-10-31 05:07:59
【问题描述】:

我已尝试使用 Newtonsoft.Json 中的 ShouldSerialize 方法阻止没有为其属性分配新值的类型对象的属性。但是我不知道如何实现它,所以请帮我解决这个问题...

这里是示例代码

public class Sample1
 {
   public String name{get;set;}
   public int Id{get;set;}; 
 }

这是我的类,其中包含上述类作为其属性之一

public class Container
 {
   public String Cname{get;set;}
   public Sample1 Sample{get;set;}; 

   public bool ShouldSerializeSample()
  {
      //What should I write here to prevent the Sample property from being serialized when its properties are assigned no new values.

  }
 }

【问题讨论】:

  • “没有分配新值”是什么意思?你能举个例子吗?
  • 表示Object类型的属性有自己的默认值。
  • 答案将取决于Sample1 的例子。例如,如果Sample1 是引用类型并且默认为null,则如果Sample 属性不是null,则应返回true,否则返回false。如果Sample1 是一个有自己的字段的对象,如果Sample1 的任何字段是非默认值,则应返回true,否则返回false

标签: c# serialization json.net


【解决方案1】:

鉴于您的示例类,我认为您正在寻找这样的东西:

public bool ShouldSerializeSample()
{
    return (Sample != null && (Sample.Id != 0 || Sample.name != null));
}

这是一个工作演示:

class Program
{
    static void Main(string[] args)
    {
        List<Container> list = new List<Container>
        {
            new Container
            {
                Cname = "Will serialize Sample because it has a name",
                Sample = new Sample1 { name = "sample 1" }
            },
            new Container
            {
                Cname = "Will serialize Sample because it has a non-zero Id",
                Sample = new Sample1 { Id = 2 }
            },
            new Container
            {
                Cname = "Will serialize Sample because it has a name and an Id",
                Sample = new Sample1 { name = "sample 3", Id = 3 }
            },
            new Container
            {
                Cname = "Will not serialize Sample because it has default values",
                Sample = new Sample1()
            },
            new Container
            {
                Cname = "Will not serialize Sample because it is null",
                Sample = null
            }
        };

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

public class Sample1
{
    public String name { get; set; }
    public int Id { get; set; }
}

public class Container
{
    public String Cname { get; set; }
    public Sample1 Sample { get; set; }

    public bool ShouldSerializeSample()
    {
        return (Sample != null && (Sample.Id != 0 || Sample.name != null));
    }
}

这是输出:

[
  {
    "Cname": "Will serialize Sample because it has a name",
    "Sample": {
      "name": "sample 1",
      "Id": 0
    }
  },
  {
    "Cname": "Will serialize Sample because it has a non-zero Id",
    "Sample": {
      "name": null,
      "Id": 2
    }
  },
  {
    "Cname": "Will serialize Sample because it has a name and an Id",
    "Sample": {
      "name": "sample 3",
      "Id": 3
    }
  },
  {
    "Cname": "Will not serialize Sample because it has default values"
  },
  {
    "Cname": "Will not serialize Sample because it is null"
  }
]

【讨论】:

  • @Brain 嗨谢谢您的帮助......它很有用。但是现在我需要在我的ShouldSerialize 方法中使用Reflection,如果您有任何想法,请分享。
  • @Madhu 你需要更具体。你想用反射来完成什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
相关资源
最近更新 更多