我正在访问一个api,当null
被正常使用时,由于某种原因,它返回false
。
我现在需要一种方法来将任意json字符串反序列化为完全泛型类型,并将任何可空/引用类型属性的JsonTokenType.False
解释为JsonTokenType.Null
,无论其嵌套有多深。
(我的目标是net7.0
和netstandard2.0
,并使用System.Text.Json
)
示例数据(需要适用于任何模式!)
{
"property": false // expected type: string
"property2": false // expected type: int
"property3": { // data might be nested
"property": false // expected type SomeType
}
}
public sealed class JsonDefinition {
public string? Property { get; set; }
public int? Property2 { get; set; }
public NestedJsonType? Property { get; set; }
}
public sealed class NestedJsonType{
public SomeType? Property { get; set; }
}
3条答案
按热度按时间5jvtdoz21#
DefaultJsonTypeInfoResolver
修饰符,该修饰符将"false as default"转换器应用于反序列化过程中遇到的每种类型的每个属性:首先,创建以下
Action<JsonTypeInfo>
修改器:现在,您将能够反序列化JSON,如下所示:
注:
false
值。// TODO: Modify these checks as required.
逻辑。演示小提琴#1 here。
JsonNode
层次结构中,然后递归删除所有false
属性值:然后,要进行反序列化,请执行以下操作:
注:
input.Replace("false", "null")
之类的简单字符串替换更健壮,因为文本false
很可能出现在某个JSON字符串中。JContainer.Descendants()
的等价物,所以我们必须自己编写一个。演示#2 here。
我删除了
false
属性,因为它看起来比用null
替换它们更健壮。如果你想用null
替换,你需要添加一个JsonConverter<bool>
,它将null
Map到false
以获得bool
值。然后反序列化如下:
演示#3 here。
6l7fqoea2#
我想我现在就用
input.Replace("false", "null")
之类的东西吧...brvekthn3#
System.Text.Json只适合于序列化“Hello World”的演示。我尝试过使用它,但是代码变得不必要的复杂。所以我给予你一个Newtonsoft.Json转换器。如果你是Text.Json的粉丝,尝试转换到它,你就会明白我在说什么