首页 > 解决方案 > 如何使用 JSON.NET 将 POCO 列表序列化为字符串列表,以减小大小?

问题描述

我有一个像这样的简单 POCO:

    public class Edit { ... }

    public class CharInsert : Edit
    {
        public int ParagraphIndex { get; set; }
        public int CharacterIndex { get; set; }
        public char Character { get; set; }
    }

像这样在 JSON 中序列化(请注意,由于继承,我正在记录对象类型):

 {
    "$type": "MyNamespace.CharInsert, MyAssembly",
    "paragraphIndex": 7,
    "characterIndex": 15,
    "character": "e"
  }

但这会占用大量空间来存储相当少量的数据。而且我有很多,所以我需要更紧凑。

我做了一个自定义JsonConverter,以便它将序列化为:

  "CharInsert|7|15|e"

当我保留这些列表时,我得到:

[
  "CharInsert|7|12|Z",
  "CharInsert|7|13|w",
  "CharInsert|7|14|i",
  "CharInsert|7|15|e",
]

但是当我尝试反序列化这个列表时,我得到了错误:

'将值“CharInsert|7|12|Z”转换为类型“MyNamespace.Edit”时出错

我想这是因为实际对象是 Edit 类型的子类,它不知道是哪一个,因为它不知道如何解析字符串。我该如何实现它,以便它可以解析字符串,解析其中包含的类型名,然后创建所需的对象类型?

标签: c#serializationjson.net

解决方案


自定义转换器的另一种方法,考虑使用[JsonProperty(PropertyName = "")]缩短 json 属性名称,这应该减少空间,您不必担心自定义转换器。

    public class CharInsert : Edit
    {
        [JsonProperty(PropertyName = "p")]
        public int ParagraphIndex { get; set; }
        [JsonProperty(PropertyName = "i")]
        public int CharacterIndex { get; set; }
        [JsonProperty(PropertyName = "c")]
        public char Character { get; set; }
    }

推荐阅读