相关疑难解决方法(0)

在JsonConverter中递归调用JsonSerializer

我正在编写一个JsonConverter执行一些我需要在读/写上完成的转换任务.特别是,我正在采用现有的序列化行为,并在读取时读取/读取这些附加属性时添加一些其他属性.

在里面JsonConverter,我想利用传递的JsonSerializer实例来执行大部分转换功能.然而,当我这样做时,我最终进入一个递归循环,其中串行器调用我的转换器调用串行器调用转换器等.

我见过人们做的事情,比如使用JsonConvert.SerializeObject,传递序列化程序实例中的所有转换器,除了 this.但是,这对我不起作用,因为它绕过了我在序列化程序上完成的所有其他自定义,例如自定义合同解析器和DateTime处理.

有没有办法可以:

  1. 使用传递给我的序列化程序实例,但不知何故排除我的转换器,或
  2. 克隆传递给我的序列化程序(无需手动构建新的并按属性复制属性)并删除我的转换器?

.net c# serialization json json.net

14
推荐指数
1
解决办法
4464
查看次数

在 System.Text.Json 中是否可以指定自定义缩进规则?

编辑:我昨天在.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
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将自动缩进更改为这样的......

{
  "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]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

c# indentation system.text.json

7
推荐指数
1
解决办法
1097
查看次数

System.Text.Json 如何让转换器利用默认的 Write() 行为

我为自定义转换器一侧编写了一个system.text.jsonRead()自定义转换器。然而,另一方面Write(),我只想使用默认的写入功能来序列化对象,而不必手动进行对象的序列化。我开始于...

public override void Write(Utf8JsonWriter writer, Customer value, JsonSerializerOptions options)
{
    throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)

JsonSerializer.Serialize(Customer)我本来希望我可以简单地使用方法中的标准Write()。就像是...

public override void Write(Utf8JsonWriter writer, Customer value, JsonSerializerOptions options)
{
    return JsonSerializer.Serialize(value);
}
Run Code Online (Sandbox Code Playgroud)

然而,这种情况似乎正在回归null。我想我所做的只是嵌套相同的行为。

作为绝望的标志,我还尝试删除该Write()方法,希望标准功能能够填补该空白,但我收到以下构建错误消息...

CS0534  'CustomerJsonConverter' does not implement inherited abstract member
'JsonConverter<Customer>.Write(Utf8JsonWriter, Customer, JsonSerializerOptions)'
Run Code Online (Sandbox Code Playgroud)

CanReadNewtonsoft.Json 具有名为且CanWrite可以设置为 False 的属性。这些强制转换器分别在反序列化和序列化时使用默认转换器功能。

我希望 System.Text.Json 中有类似的东西?


更新1

使用@Guilherme的建议......它部分有效。但是,该方法给出了不完整的 Json 对象。

作为背景,当我反序列化原始源 Json 时,我必须处理原始 Json (我无法控制)的情况,它有一个可以是空""、对象{ "key": "value" …

c# json converters system.text.json

5
推荐指数
1
解决办法
4619
查看次数