如何在Json.NET中将某些特殊值视为null / default?

时间:2019-01-01 18:57:17

标签: c# json.net

我使用以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

0 个答案:

没有答案