我希望能够在使用System.Text.Json.JsonSerializer进行序列化时排除属性。我不想在JsonIgnore
每个我想做的地方都使用属性。我希望能够通过某种Fluent
API定义仅在序列化过程中要排除的属性,目前尚不存在。
我能够找到的唯一选择是定义一个JsonConverter
,并将其添加到JsonSerializerOptions
我传递给Serialize()方法的的Converters列表中,如下所示:
var options = new JsonSerializerOptions();
options.Converters.Add(new BookConverter());
json = JsonSerializer.Serialize(book, options);
在JsonConverter中,我必须使用自己编写整个JSON表示形式Utf8JsonWriter
,但不包括我不想序列化的属性。仅仅能够排除一个属性,这是很多工作。尽管JsonConverter是.NET团队的一项出色的可扩展性功能,但对于我的用例而言,它只是太底层了。有谁知道有其他方法可以实现排除属性,而不必亲自写出JSON表示形式?
我不想执行以下操作:
private
或protected
例:
class Program
{
void Main()
{
// We want to serialize Book but to ignore the Author property
var book = new Book() { Id = 1, Name = "Calculus", Author = new Author() };
var json = JsonSerializer.Serialize(book);
// Default serialization, we get this:
// json = { "Id": 1, "Name": "Calculus", "Author": {} }
// Add our custom converter to options and pass it to the Serialize() method
var options = new JsonSerializerOptions();
options.Converters.Add(new BookConverter());
json = JsonSerializer.Serialize(book, options);
// I want to get this:
// json = { Id: 1, Name: "Calculus" }
}
}
public class Author { }
public class Book
{
public int Id { get; set; }
public string Name { get; set; }
public Author Author { get; set; }
}
public class BookConverter : JsonConverter<Book>
{
public override Book Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// Use default implementation when deserializing (reading)
return JsonSerializer.Deserialize<Book>(ref reader, options);
}
public override void Write(Utf8JsonWriter writer, Book value, JsonSerializerOptions options)
{
// Serializing. Here we have to write the JSON representation ourselves
writer.WriteStartObject();
writer.WriteNumber("Id", value.Id);
writer.WriteString("Name", value.Name);
// Don't write Author so we can exclude it
writer.WriteEndObject();
}
}
因此,我偶然发现了一篇文章,该文章演示了如何JsonDocument
在新System.Text.Json
名称空间中使用该对象,这是Fluent
API的第二大优点。这是解决这个问题的方法。
BookConverter.Write()方法:
public override void Write(Utf8JsonWriter writer, Book value, JsonSerializerOptions options)
{
writer.WriteStartObject();
using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(value)))
{
foreach (var property in document.RootElement.EnumerateObject())
{
if (property.Name != "Author")
property.WriteTo(writer);
}
}
writer.WriteEndObject();
}
问题内容: 我正在尝试仅使用json.net序列化类的继承属性。我知道[JsonIgnore]属性,但是我只想在某些情况下忽略它们,因此我改用了自定义JsonConverter。 这是我的课: 做一个简单的o.WriteTo(writer); 它给出的结果与不使用转换器的结果相同。当遍历属性并在属性上使用WriteTo时,它对于基本类型(int,字符串等)正常工作,但是集合存在问题。 预期: 得到
问题内容: 我有一个复杂的对象图,正在使用Json.NET进行序列化/反序列化。有些对象是从抽象类派生的,因此为了使反序列化正常工作,我需要创建一个custom 。它的唯一作用是在反序列化时选择抽象类的适当具体实现,并允许Json.NET继续进行。 我要序列化时出现问题。我根本不需要做任何自定义。我希望获得与没有custom时将使用的行为完全相同的行为。 但是,由于我将自定义JsonConvert
主要内容:使用excludeFieldsWithModifiers()方法,使用@Expose注解默认情况下,GSON排除序列化/反序列化过程中的瞬态和静态字段。 我们来看看下面的例子。 示例 创建一个名为的Java类文件:GsonTester.java - 执行上面示例代码,得到以下结果 - 使用excludeFieldsWithModifiers()方法 GsonBuilder使用序列化/反序列化过程中的方法提供对使用特定修饰符排除字段的控制。 看下面的例子。 示例 创建一个名为的Java
我需要在定义的 POJO 列表中动态排除某些属性。要序列化的主要 POJO 是: id是被忽略,如果忽略id=true,像这样: 目前,我已经尝试使用< code>JsonFilter和< code>JacksonJsonViews但无法获得所需的输出。如果能给出实现这一目标的任何指示,我将非常高兴。
问题内容: 我的类DataType有一个JsonConverter。当在Json中使用纯字符串作为DataType类型的属性的值时,我想做一些特殊的处理。在值是“完整”对象的情况下,我想进行“常规”反序列化。 这是我的尝试 但这不起作用,因为这行:DataType dataType = serializer.Deserialize(reader); 导致无限递归。 可以通过某种方式轻松完成吗?(无
默认情况下,GSON从序列化/反序列化过程中排除瞬态和静态字段。 我们来看看下面的例子。 例子 (Example) 在C:\“GSON_WORKSPACE中创建名为GsonTester的Java类文件。 File: GsonTester.java import com.google.gson.Gson; import com.google.gson.GsonBuilder; public c