当前位置: 首页 > 面试题库 >

序列化为JSON时排除集合中的特定项目

柴嘉禧
2023-03-14
问题内容

我试图“挑选”要序列化的特定类型的集合中的哪些对象。

设置示例:

public class Person
{
    public string Name { get; set; }

    public List<Course> Courses { get; set; }
}

public class Course
{
    ...

    public bool ShouldSerialize { get; set; }
}

我需要能够排除Person.Courses集合中其中ShouldSerialize为false的所有课程。这需要在ContractResolver内完成-
ShouldSerialize属性是一个示例,在我的实际情况下,可能还有其他条件。我希望不必创建ShouldSerializeCourse(如此处指定:http
://james.newtonking.com/json/help/index.html?topic=html/ConditionalProperties.htm


我似乎找不到在ContractResolver中重写的方法。我将如何处理?


问题答案:

我认为您不能使用ContractResolver过滤列表,但是可以使用自定义JsonConverter进行过滤。这是一个例子:

class Program
{
    static void Main(string[] args)
    {
        List<Person> people = new List<Person>
        {
            new Person 
            {
                Name = "John",
                Courses = new List<Course>
                {
                    new Course { Name = "Trigonometry", ShouldSerialize = true },
                    new Course { Name = "History", ShouldSerialize = true },
                    new Course { Name = "Underwater Basket Weaving", ShouldSerialize = false },
                }
            },
            new Person
            {
                Name = "Georgia",
                Courses = new List<Course>
                {
                    new Course { Name = "Spanish", ShouldSerialize = true },
                    new Course { Name = "Pole Dancing", ShouldSerialize = false },
                    new Course { Name = "Geography", ShouldSerialize = true },
                }
            }
        };

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.Converters.Add(new CourseListConverter());
        settings.Formatting = Formatting.Indented;

        string json = JsonConvert.SerializeObject(people, settings);
        Console.WriteLine(json);
    }
}

class CourseListConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(List<Course>));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, ((List<Course>)value).Where(c => c.ShouldSerialize).ToArray());
    }

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

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

public class Person
{
    public string Name { get; set; }
    public List<Course> Courses { get; set; }
}

public class Course
{
    public string Name { get; set; }
    [JsonIgnore]
    public bool ShouldSerialize { get; set; }
}

输出:

[
  {
    "Name": "John",
    "Courses": [
      {
        "Name": "Trigonometry"
      },
      {
        "Name": "History"
      }
    ]
  },
  {
    "Name": "Georgia",
    "Courses": [
      {
        "Name": "Spanish"
      },
      {
        "Name": "Geography"
      }
    ]
  }
]


 类似资料:
  • 我有一个pojo类型,需要在序列化时将特定的数值设置为特殊字符串。这些值将始终为空,可能深入到层次结构中。 为了做到这一点,我首先将pojo转换为一个JsonNode,保留空值以保持属性顺序,然后按照结构中的路径设置一些字符串并根据需要创建节点。最后,我让ObjectMapper将JsonNode序列化为字符串。逻辑看起来像这样: 注意,我知道有一个注释,所以我实际上不需要两个映射器,但事实证明,

  • 问题内容: 我正在为项目使用Typescript,需要将集合序列化为json,将其保存到文件中,然后将该文件反序列化为类似的集合。该集合看起来像: 我的工具界面如下所示: 工具实现如下所示: 我有一些工具界面的实现:textTool,imageTool和rectangleTool。我需要解决的问题是,当我将文件内容反序列化为工具集合时,我只会得到一个常规对象,而不是例如textTool的实例。 我

  • 问题内容: 我有以下课程: 我有Struts2控制器,我只想返回Class Student的序列化实例。 它返回了带有所有子类的可序列化的学生对象,但是我只希望有一个学生对象而没有返回hashset。如何告诉Struts仅序列化对象?我确实启用了延迟加载,并且将哈希集作为代理类返回。 问题答案: 请参见此处的答案,其中显示了包含和排除属性的使用。我不认为该示例明确显示排除嵌套对象,但是我已将其用于

  • 有没有一种方法可以使用Jackson JSON处理器来执行自定义字段级别的序列化?例如,我想让 注意,age=25被编码为数字,而favoritenumber=123被编码为字符串。Jackson将编组为一个数字。在这种情况下,我希望将favoriteNumber编码为字符串。

  • 包装com.company;进口java.io.*; 导入静态com。公司主要的磁盘 公共类存储系统{private static final String FILE_NAME=“D:/Songs.data”; } 无法序列化/反序列化。我有一个应该写入文件然后输出的歌曲列表。我不明白为什么它只读取一首歌。 档案:�Øsrcom。公司歌曲“Ї……ј04јJ L genget Ljava/lang

  • 问题内容: 我有一个Python ,其中包含带有和方法的对象,以确保集合中没有重复项。 我需要对该结果进行json编码,但是即使将一个空值传递给该方法也会引发。 我知道我可以为具有自定义方法的类创建扩展,但是我什至不知道从哪里开始进行转换。我是否应该使用默认方法中的值创建字典,然后返回该方法的编码?理想情况下,我想使默认方法能够处理原始编码器阻塞的所有数据类型(我将Mongo用作数据源,所以日期似