Вы можете переопределить поведение сериализации по умолчанию, указав свой JsonConverter
. В следующем примере показан модуль форматирования, который записывает int * int
кортежи в виде двухэлементных JSON массивов.
open Newtonsoft.Json
type IntIntConverter() =
inherit JsonConverter<int * int>()
override x.WriteJson(writer:JsonWriter, (a:int,b:int), serializer:JsonSerializer) =
writer.WriteStartArray()
writer.WriteValue(a)
writer.WriteValue(b)
writer.WriteEndArray()
override x.ReadJson(reader, objectType, existingValue, hasExistingValue, serializer) =
(0, 0)
let sample = [ (1,2); (3,4) ]
let json = JsonConvert.SerializeObject(sample, Formatting.None, IntIntConverter())
Результат выполнения этого будет [[1,2],[3,4]]
. Обратите внимание, что я не реализовал метод ReadJson
, поэтому вы еще не можете разобрать кортежи. Это потребует дополнительной работы, но вы можете посмотреть на существующие JsonConverter
s, чтобы увидеть, как это должно быть сделано.
Также обратите внимание, что это для определенного типа кортежа c, содержащего два целых числа. Если вам нужно поддерживать другие кортежи, вам, вероятно, потребуется предоставить несколько вариантов конвертера.