F#:JsonConvert.SerializeObject()多次保存相同的数据



我是编程新手,F#是我的第一门语言。

我遵循了这个线程中给我的建议,使用NewtonSoft.Json

[<CLIMutable>]
[<JsonObject(MemberSerialization=MemberSerialization.OptOut)>]
type FighterSummary =
{ 
mutable fighter: string; 
mutable record: string option; 
mutable reach: float option; 
mutable stance: string option; 
}
let fighterFilesDir = @"G:Fighter Pages"
let fighterFiles = Directory.GetFiles(fighterFilesDir)
let fighterGroups = splitArrayIntoGroups fighterFiles 50
for group in fighterGroups do
let fighterStats =   seq { 
for file in group do
let html = File.ReadAllText(file)
let fighterOverview = getFighterSummary html
printfn "Extracted %s's overview." (Path.GetFileNameWithoutExtension(file))
yield fighterOverview
} 
|> Seq.toArray
let fileName = Path.GetFileNameWithoutExtension(group.[0]) + " -- " + Path.GetFileNameWithoutExtension(group.[group.Count() - 1])
let saveFilePath = @"G:Fighter Data JSON Files" + fileName + ".json"
File.WriteAllText(saveFilePath, JsonConvert.SerializeObject(fighterStats))

我已经使用F#Interactive测试了getFighterSummary和splitArrayIntoGroups函数。他们工作出色。

当我将FighterSummary类型的记录保存到JSON中时,我会为每个不同的fighter看到类似的内容:

{"fighter@": "Alessio Sakara",
"record@": {
"Case": "Some",
"Fields": ["19-11-0 (1 NC)"]
},
"reach@": {
"Case": "Some",
"Fields": [182.88]
},
"stance@": {
"Case": "Some",
"Fields": ["Orthodox"]
},
"fighter": "Alessio Sakara",
"record": {
"Case": "Some",
"Fields": ["19-11-0 (1 NC)"]
},
"reach": {
"Case": "Some",
"Fields": [182.88]
},
"stance": {
"Case": "Some",
"Fields": ["Orthodox"]}

每个战斗机的信息保存两次——第一次在每个字段名称的末尾都有一个"@",第二次没有。

相反,我想要的是关于战斗机的信息只保存一次,每个字段名称的末尾都没有"@"。

我在这里阅读了答案,回答了一个面临类似问题的人提出的问题。我试着执行那里提供的建议,但没有奏效。

如果有人能帮我解决这个问题,我将不胜感激。非常感谢。

编辑:

我在反序列化JSON时也遇到了问题。当我运行时

JsonConvert.DeserializeObject<FighterSummary>(File.ReadAllText(@"G:Fighter Data JSON FilesFighters.json"))

我收到以下错误消息:

System.Reflection.CustomAttributeFormatException:未找到指定的"MemberSerialization"属性。--->System.Reflection.CustomAttributeFormatException:找不到指定的"MemberSerialization"属性。

请注意,在您提到的帖子中,他们使用了[<CliMutable>],但成员本身不是mutable。在查看您的代码时,我不明白您为什么需要mutable(在F#中)。mutable关键字允许使用很少在F#中使用的<-进行分配。[<CliMutable>]在那里,因此编译的代码是可变的,但它在F#代码中保持不变。

当您想要使用记录时,这有时很有用,例如使用反射。如果您只使用[<CliMutable>]而不在F#中使用mutable关键字,那么JSON.Net应该能够处理这些事情。

相关内容

  • 没有找到相关文章

最新更新