我有一个库,可以向我发送包含元组的结果。我需要处理一些数据,对其进行序列化,然后它继续进入另一个系统。
元组总是由 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
以了解应该如何完成此操作。
另请注意,这适用于包含两个整数的特定元组类型。如果您需要支持其他元组,则可能需要提供转换器的几种变体。