Serialize/deserialize 一个以逗号分隔条目的字典

Serialize/deserialize a Dictionary with a comma-separated entry

我正在开发一个 ASP.NET Core 3.1 网站,我在 Dictionary 中有数据,我想 Serialize/Deserialize 使用 Microsoft System.Text.Json(实际上我是 Json serialize/deserialize 的新手)。数据来自 PostgreSQL 数据库查询,其中一个返回值是 STRING_AGG 函数生成的以逗号分隔的整数列表(转换为字符串)。下图显示了词典的条目之一:

我使用以下代码对其进行序列化。请注意,我已经尝试了 Microsoft System.Text.JsonNewtonsoft.

jsonResult = Newtonsoft.Json.JsonConvert.SerializeObject(result);
//jsonResult = JsonSerializer.Serialize(result);

字典中的数据应根据以下class结构反序列化:

我使用以下代码:

//IEnumerable<SeccGralContenidoViewModel> seccGralContenido = JsonSerializer.Deserialize<IEnumerable<SeccGralContenidoViewModel>>(_seccGralContenidoRepository.Read());
IEnumerable<SeccGralContenidoViewModel> seccGralContenido = Newtonsoft.Json.JsonConvert.DeserializeObject <IEnumerable<SeccGralContenidoViewModel>>(_seccGralContenidoRepository.Read());

但是无论我用Newtonsoft还是System.Text.Json:[=16=反序列化都会抛出异常]

我最初使用 System.Text.Json 命名空间,但我也尝试使用 Newtonsoft。经过更深入的分析,我发现问题可能出在数据保存到 Dictionary 的方式上,但我还没有找到解决方法。

如果您不想编写自定义转换器,那么最简单的解决方案是引入另一个 属性:

public string CategoriasContenidolds {get; set;}

private static char delimiter = ',';
[JsonIgnore]
public string[] CategoriasContenidolds_Collection
{
    get => CategoriasContenidolds.Split(delimiter).Select(item => item.Trim()).ToArray();
    set => CategoriasContenidolds = string.Join(delimiter, value);
} 
  • 序列化程序将在序列化和反序列化期间使用 CategoriasContenidolds 属性
  • 您应该在业务逻辑中使用 CategoriasContenidolds_Collection(或任意命名)
    • 通过使用 JsonIgnore 显式标记此 属性,序列化程序将忽略

我可以通过直接从查询中获取 JSON 格式的结果来解决我的问题。 PostgreSQL 做得很好。这样我也避免了执行两步过程:首先,获取查询结果;其次,序列化为 JSON.