У меня довольно большая структура JSON, которую мне нужно обновить значениями из файла CSV.
Каждая строка в файле CSV содержит идентификатор обновляемого объекта и имя поля.Значения, которые я хочу обновить, могут быть вложенными.
Чтение данных JSON с JsonTypeProvider легко, но как я могу объединить значения перед записью их в файл?
Я не хочусоздать тип, который соответствует структуре 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<...>
для создания экземпляра типа и обновлять только те поля, которые я хочу обновить?