如何将元组序列化为 F# 中的列表?



我有一个库,可以向我发送包含元组的结果。我需要处理一些数据,对其进行序列化,然后它继续进入另一个系统。

元组总是由 2 个值组成,但它们在序列化时非常浪费:

(3, 4)

将序列化为:

{"Item1":3,"Item2":4}

[3; 4]

将序列化为:

[3,4]

我想避免重建整个数据结构并复制所有数据来更改这部分。

有没有办法在序列化程序级别将元组转换为列表?

下一个进程的解析器可以很容易地改变以适应列表而不是元组,所以这似乎是最好的方案。

丑陋的选择是使用正则表达式修复序列化字符串,但我真的很想避免这样做。

可以通过指定自己的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以了解应该如何完成此操作。

另请注意,这适用于包含两个整数的特定元组类型。如果您需要支持其他元组,则可能需要提供转换器的几种变体。

最新更新