我有一个转换器准备我的双打这样。
class DoubleConverter : JsonConverter<double>
{
public override double Read(...) { ... }
public override void Write(Utf8JsonWriter writer, double value, JsonSerializerOptions options)
{
writer.WriteStringValue(value + " double from...?");
}
}
我希望能够指定它转换自的属性的名称。(实际上,这是关于控制数字的数量,但也可能需要其他东西)。
没有真正找到任何好的方法(只是遵循docs)或信息在overriden方法。我有两个想法,没有一个对我有吸引力。
1.使用属性为每个特性分别分配DTO类中的自定义转换器。我甚至不确定它是否会工作,即使是这样,它的waaaay乏味。
1.在JsonConverter<MyDto>
上实现转换器。这将意味着很多不必要的自定义实现。还有一个乏味的部分
这些是唯一的选择吗?还是有办法绕过它?
1条答案
按热度按时间wmomyfyw1#
不可能从
Utf8JsonWriter
获取当前路径或属性名,原因很简单,它不跟踪路径。它唯一跟踪的是一个BitStack
,它指示当前容器是数组还是对象。[1]第一章相反,在**.NET 7及更高版本**中,您可以使用typeInfo modifier来自定义类型的contract,以将转换器添加到每个双值成员,其构造函数被传递其
MemberInfo
。首先定义以下修饰符:
现在,如果你的模型看起来像这样,例如:
然后使用修饰符序列化,如下所示:
您将看到生成的JSON包含显示属性名称的注解:
注意事项:
相反,考虑向模型中添加自定义属性,指示所需的格式,然后在
typeInfo
修饰符中,将该信息传递给适当的转换器。或者,如果您只需要控制位数,请应用适当的
RoundingJsonConverter
从this answer到 Convert JsonConverter to System.Text.Json to support multiple primitive types and nullable。演示小提琴here。
[1]您也无法从
Utf8JsonReader
获取路径。详情请参见 How do I get the property path from Utf8JsonReader?。