【发布时间】:2021-06-13 05:52:09
【问题描述】:
在 F# 中使用 Newtonsoft 反序列化 JSON 对象时,我注意到反序列化过程会将缺失的整数字段转换为其默认值。在以下示例中,instanceB 中缺少的整数字段将转换为具有默认值 (0) 的整数字段。但是当缺少的字段是instanceC(类型为string)中的Name 时,它会转换为null。为什么反序列化的输出会根据字段的类型而不同?
#r """Newtonsoft.Json.dll"""
open Newtonsoft.Json
type Test = {
Id: int
Name: string
}
let instanceA = """{"Id": 1, "Name": "A"}"""
let instanceB = """{"Name": "A"}"""
let instanceC = """{"Id": 1}"""
let A = JsonConvert.DeserializeObject<Test>(instanceA)
let B = JsonConvert.DeserializeObject<Test>(instanceB)
let C = JsonConvert.DeserializeObject<Test>(instanceC)
printfn "%A" A
printfn "%A" B
printfn "%A" C
输出:
val A : Test = { Id = 1
Name = "A" }
val B : Test = { Id = 0
Name = "A" }
val C : Test = { Id = 1
Name = null }
【问题讨论】:
-
如果我是 .NET 和 F# 的初学者,我很可能会期望一个空字符串而不是 null。字符串甚至可以为空是不合逻辑的,并且是 .NET 设计中的一个众所周知的缺陷。 (这里还有一条评论被删除了,所以我的这条评论现在有点断章取义了。)
标签: json f# json.net json-deserialization