我正在编写一个JsonConverter执行一些我需要在读/写上完成的转换任务.特别是,我正在采用现有的序列化行为,并在读取时读取/读取这些附加属性时添加一些其他属性.
在里面JsonConverter,我想利用传递的JsonSerializer实例来执行大部分转换功能.然而,当我这样做时,我最终进入一个递归循环,其中串行器调用我的转换器调用串行器调用转换器等.
我见过人们做的事情,比如使用JsonConvert.SerializeObject,传递序列化程序实例中的所有转换器,除了 this.但是,这对我不起作用,因为它绕过了我在序列化程序上完成的所有其他自定义,例如自定义合同解析器和DateTime处理.
有没有办法可以:
编辑:我昨天在.Net 运行时 repo 上提出了一个问题,该问题已被“layomia”关闭,并带有以下消息:“添加这样的扩展点会在较低级别的读取器和写入器上带来性能成本,并且不会带来良好的性能性能和功能/好处之间的平衡。提供这样的配置不在 System.Text.Json 路线图上。”
当设置 JsonSerializerOptions.WriteIndented = true 缩进在编写 json 时看起来像这样......
{
  "TILESET": "tilesets/HOW_TO_GET_TILESET_NAME_?",
  "TILES": {
    "TILE_1": {
      "NAME": "auto_tile_18",
      "TEXTURE_BOUNDS": [
        304,
        16,
        16,
        16
      ],
      "SCREEN_BOUNDS": [
        485,
        159,
        64,
        64
      ]
    }
  }
}
有没有办法将自动缩进更改为这样的......
{
  "TILESET": "tilesets/HOW_TO_GET_TILESET_NAME_?",
  "TILES": 
  {
    "TILE_1": 
    {
      "NAME": "auto_tile_18",
      "TEXTURE_BOUNDS": [304, 16, 16,16],
      "SCREEN_BOUNDS": [485, 159, 64, 64]
    }
  }
}
我为自定义转换器一侧编写了一个system.text.jsonRead()自定义转换器。然而,另一方面Write(),我只想使用默认的写入功能来序列化对象,而不必手动进行对象的序列化。我开始于...
public override void Write(Utf8JsonWriter writer, Customer value, JsonSerializerOptions options)
{
    throw new NotImplementedException();
}
JsonSerializer.Serialize(Customer)我本来希望我可以简单地使用方法中的标准Write()。就像是...
public override void Write(Utf8JsonWriter writer, Customer value, JsonSerializerOptions options)
{
    return JsonSerializer.Serialize(value);
}
然而,这种情况似乎正在回归null。我想我所做的只是嵌套相同的行为。
作为绝望的标志,我还尝试删除该Write()方法,希望标准功能能够填补该空白,但我收到以下构建错误消息...
CS0534  'CustomerJsonConverter' does not implement inherited abstract member
'JsonConverter<Customer>.Write(Utf8JsonWriter, Customer, JsonSerializerOptions)'
CanReadNewtonsoft.Json 具有名为且CanWrite可以设置为 False 的属性。这些强制转换器分别在反序列化和序列化时使用默认转换器功能。
我希望 System.Text.Json 中有类似的东西?
使用@Guilherme的建议......它部分有效。但是,该方法给出了不完整的 Json 对象。
作为背景,当我反序列化原始源 Json 时,我必须处理原始 Json (我无法控制)的情况,它有一个可以是空""、对象{ "key": "value" …