gpt4 book ai didi

f# - Newtonsoft.Json 将某些项目序列化两次

转载 作者:行者123 更新时间:2023-12-04 18:34:02 33 4
gpt4 key购买 nike

我今天注意到 Newtonsoft.Json 有一些奇怪的输出,我不确定它是与 F# 类型的交互还是在 C# 中也可能发生的东西,所以我已经标记了两者。我有以下正在序列化的记录的列表:

 type SplitTracker = 
{
[<JsonIgnore>]
split : SplitDefinition
mutable start : duration
mutable ``end`` : duration
mutable lapCount : int
mutable duration : duration Option
}

我用 JsonConvert.SerializeObject连载了它我得到以下奇怪的输出:
 "splits": [
{
"start@": "0.00",
"end@": "0.00",
"lapCount@": 0,
"duration@": null,
"start": "0.00",
"end": "0.00",
"lapCount": 0,
"duration": null
},
{
"start@": "0.00",
"end@": "0.00",
"lapCount@": 0,
"duration@": null,
"start": "0.00",
"end": "0.00",
"lapCount": 0,
"duration": null
}

有谁知道为什么会发生这种情况?数据正确,带有“@”符号的字段重复是问题所在。

最佳答案

您定义记录的方式是这里的罪魁祸首。记录字段作为属性公开 - 但您使用的是可变属性。 F# 将把它变成一个类,其中包含每个可变变量的字段(名称是属性名称,以 @ 为前缀),以及读取这些字段的属性。

Json 现在将尝试序列化所有字段和所有属性 - 因此您会得到重复。

在 F# 交互中尝试一下:

type SplitTracker = 
{
mutable start : float
}
let t = typeof<SplitTracker>
let fields1 = t.GetFields() // This will give you a field '@start'
let props1 = t.GetProperties() // This will give you a property 'start'

将其与使用普通记录时得到的结果进行对比:
type SplitTracker2 = 
{
start : float
}
let t2 = typeof<SplitTracker2>
let fields2 = t2.GetFields() // You will not see any fields
let props2 = t2.GetProperties() // There is a single property 'start'

这应该正确序列化。除此之外,它使您的代码更加地道。

关于f# - Newtonsoft.Json 将某些项目序列化两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36310395/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com