为什么 Newtonsoft 将缺少的整数字段转换为 F# 中的默认值?
Why is Newtonsoft converting a missing integer field to its default value in F#?
在 F# 中使用 Newtonsoft 反序列化 JSON 对象时,我注意到反序列化过程会将缺失的整数字段转换为其默认值。在以下示例中,instanceB
中缺失的整数字段被转换为具有默认值 (0
) 的整数字段。但是当缺少的字段是 instanceC
中的 Name
(属于 string
类型)时,它会转换为 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 中,某些类型具有 null
作为可能的值,而有些则没有。后者称为“值类型”,前者称为“引用类型”。
int
是值类型,所以不能是null
.
string
是引用类型,所以可以。
虽然每种类型都有默认值。对于引用类型,默认值为 null
。对于值类型,它取决于类型,但通常是零的一些变体。所以这些就是您获得的值。
在 F# 中使用 Newtonsoft 反序列化 JSON 对象时,我注意到反序列化过程会将缺失的整数字段转换为其默认值。在以下示例中,instanceB
中缺失的整数字段被转换为具有默认值 (0
) 的整数字段。但是当缺少的字段是 instanceC
中的 Name
(属于 string
类型)时,它会转换为 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 中,某些类型具有 null
作为可能的值,而有些则没有。后者称为“值类型”,前者称为“引用类型”。
int
是值类型,所以不能是null
.
string
是引用类型,所以可以。
虽然每种类型都有默认值。对于引用类型,默认值为 null
。对于值类型,它取决于类型,但通常是零的一些变体。所以这些就是您获得的值。