我是编程新手,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应该能够处理这些事情。