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

如何在自定义JsonConverter中使用默认序列化

戴正阳
2023-03-14
问题内容

我有一个复杂的对象图,正在使用Json.NET进行序列化/反序列化。有些对象是从抽象类派生的,因此为了使反序列化正常工作,我需要创建一个custom
JsonConverter。它的唯一作用是在反序列化时选择抽象类的适当具体实现,并允许Json.NET继续进行。

我要序列化时出现问题。我根本不需要做任何自定义。我希望获得JsonConvert.SerializeObject与没有custom时将使用的行为完全相同的行为JsonConverter

但是,由于我将自定义JsonConverter类用于反序列化需求,因此我不得不提供WriteJson实现。由于WriteJson是抽象的,因此我不能只调用base.WriteJson,但我实际上想这样做。因此,我的问题是,我应采用哪种方法来获得简·简的默认行为?换一种说法:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    // What goes here to get default processing?
}

问题答案:

在您的custom中JsonConverter,覆盖CanWrite并返回false:

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

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    throw new NotImplementedException();
}

然后,您可以从抛出一个异常WriteJson,因为它不会被调用。

(同样,要获得在默认的行为
系列化,覆盖CanRead和回报false。)

请注意,可以使用相同的方法JsonConverter<T>(在Json.NET
11.0.1中
引入),因为它只是其中的子类JsonConverter,引入了ReadJson()和的类型安全版本WriteJson()



 类似资料:
  • 问题内容: 我的类DataType有一个JsonConverter。当在Json中使用纯字符串作为DataType类型的属性的值时,我想做一些特殊的处理。在值是“完整”对象的情况下,我想进行“常规”反序列化。 这是我的尝试 但这不起作用,因为这行:DataType dataType = serializer.Deserialize(reader); 导致无限递归。 可以通过某种方式轻松完成吗?(无

  • 我想创建一个自定义序列化程序,它只做一点点工作,然后将其余部分留给默认序列化。 例如: 通过为聚合对象创建其他自定义序列化器的想法,这些对象根据“特殊”属性值表现不同。然而,上面的代码不起作用,因为它毫不奇怪地进入了无限递归。 一旦我设置了属性,有没有办法告诉jackson使用默认序列化?我真的不想像许多自定义序列化程序那样枚举所有属性,因为该类相当复杂,并且我不想每次更改该类时都必须对序列化程序

  • 问题内容: 我想创建一个自定义的序列化程序,该工作量很小,然后将其余的保留给默认序列化。 例如: 通过为聚合对象创建其他自定义序列化程序的想法,这些对象的行为基于“特殊”属性值而有所不同。但是,上面的代码不起作用,因为毫无疑问,它进行了无限递归。 设置属性后,是否可以告诉杰克逊使用默认序列化?我真的不希望像许多自定义序列化程序那样枚举所有属性,因为该类相当复杂,并且我不想每次更改类时都必须对序列化

  • 假设我正在为某个类编写自定义序列化,但希望使用默认方法处理其中一个字段。 那要怎么做? 序列化时,我们有。 但反序列化的相应方法是什么? 请注意以下代码: 如何实现MyOuterDeserializer?

  • 我想通过扩展默认的反序列化器来创建自己的反序列化器,在其后面设置更多的值: 如您所见,我还想将此DTO母类重用于其他DTO。 我没有找到任何这样的例子。我真的是世界上第一个 反序列化的“AsUsual”(p,ctxt)应该是什么 我应该使用什么motherclass?JsonDeserializer/StdDeserializer/UntypedObjectDeserializer 反序列化程序会

  • 我在Jackson的自定义反序列化程序中有一个问题。我想访问默认序列化程序来填充我要反序列化到的对象。在填充之后,我将执行一些自定义操作,但首先我要使用默认的Jackson行为反序列化对象。 这是我现在有的代码。 我需要的是一种初始化默认反序列化器的方法,这样我就可以在开始我的特殊逻辑之前预填充我的POJO。 当从自定义反序列化程序内调用deserialize时,无论我如何构造序列化程序类,该方法