我有一个很大的JSON结构,需要使用CSV文件中的值进行更新。
CSV文件中的每一行都包含要更新的对象的ID和字段名称。我要更新的值可以嵌套。
使用JsonTypeProvider读取JSON数据很容易,但是如何在将值写入文件之前合并这些值?
我不想创建一个与JSON结构匹配并反序列化的类型,因为它包含了许多我不感兴趣的值,但是我需要将它们全部包含在最终结果中。
这是我的程序:
type JsonFile = JsonProvider<"./myjson.json">
type CsvFile = CsvProvider<"./texts.csv">
[<EntryPoint>]
let main argv =
let jsonValues = JsonFile .GetSample().Result
let texts = CsvFile.GetSample().Rows
let result =
jsonValues
|> Seq.map(fun v ->
// I would like to merge values here
let texts = texts |> Seq.filter(fun t -> t.Id = string v.Id)
let description = texts |> Seq.tryFind (fun t -> t.FieldName = "Description")
if description.IsSome then
v.Description.["en"] <- description.Value.En // This doesn't work of course, just an example of what I would like to do
v.Description.["no"] <- description.Value.No
// etc etc
v.JsonValue
)
|> Seq.map(fun json -> json.ToString(JsonSaveOptions.DisableFormatting))
|> String.concat "\n"
let fileName = "./mergedvalues.ndjson"
File.WriteAllText(fileName,
result,
System.Text.Encoding.UTF8)
0
如何更新JSON文件的值?
我看到JsonTypeProvider可能不适合做这种事情,我愿意接受任何建议。
更新:
所以我发现我可以创建这样的新值:
let newDescription =
JsonFile.Description(``type`` = v.Type,
no = v.Description.No,
en = Some "my new value",
fr = v.Description.Fr,
de = v.Description.De,
nl = v.Description.Nl)
我的问题是我的某些记录具有很多字段,因此使用这样的构造函数确实很不方便,有时甚至很难正确。有什么方法可以使用现有的JsonProvider<...>
值来实例化类型,并仅更新我想更新的字段?
答案 0 :(得分:1)
在这种情况下,您应该考虑使用JsonValue Properties属性,该属性基本上是一个字符串* JsonValue数组。
然后,您可以匹配在csv中定义的属性,并越来越深地更新(折叠)您的jsonvalue并将其注入到主构造函数中(如果没有重新定义,则为root)。