我使用以JSON发送其配置的设备:
{
"A": {
"AA": "1,customconverter,2019",
"AB": {
"ABA": "google.com",
"ABB": 25.0
}
},
"B": {
"BA": 100
}
}
对应的.NET类:
class AA
{
public int X { get; set; }
public string Y { get; set; }
public DateTime Z { get; set; }
}
class AB
{
public string ABA { get; set; }
public double? ABB { get; set; }
}
class A
{
[JsonConverter(typeof(MyCustomJsonConverter))]
public AA AA { get; set; }
public AB AB { get; set; }
}
enum MyEnum
{
Unknown = 0,
Wow = 1,
Lol = 2
}
class B
{
public MyEnum BA { get; set; }
}
class Config
{
public A A { get; set; }
public B B { get; set; }
}
某些特定设备可能没有例如AB设置,而不是发送普通的“ null”或仅忽略该字段,而是发送“?”代替:
{
"A": {
"AA": "1,customconverter,2019",
"AB": "?"
},
"B": {
"BA": 100
}
}
任何字段都可以发生,无论它是否是字符串。
Config类非常庞大而深刻。我经常使用自定义转换器。我需要的是一些可以转换此问号“?”的方法。如果它是值类型,则返回默认值;如果它是可空/类/引用类型,则返回null。
我考虑过一些全局性的JsonConverter,但是似乎我不能仅仅为每个可能的类型都应用一个JsonConverter,因为它有无限的递归问题。如果转换器仅设计用于一种类型,则很容易避免这种情况: https://stackoverflow.com/a/36116462/6440521 但是如果转换器应用于多种类型/全局,如何避免这种情况呢? 我也可以从自定义JsonConverter退回到一些默认行为: https://stackoverflow.com/a/35590069/6440521 但是如何基于objectType回退到其他转换器(例如,在property属性中指定的转换器)(请注意,我们位于处理许多类型的全局JsonConverter中)?
在Json.NET中执行此操作的最佳方法是什么?
编辑: 目前,我的解决方法是替换所有出现的“?”在反序列化之前为null,并在所有位置(对于值类型)使用nullables