【问题标题】:Serialize/deserialize a Dictionary with a comma-separated entry使用逗号分隔条目序列化/反序列化字典
【发布时间】:2021-03-02 18:23:54
【问题描述】:

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

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

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

Dictionary中的数据应该按照如下类结构进行反序列化:

我使用以下代码:

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

但是,无论我使用 Newtonsoft 还是 System.Text.Json,反序列化时都会引发异常:

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

【问题讨论】:

  • 我是否理解正确,您希望将" 1, 2, 6" 反序列化为string[] { "1", "2", "6" },反之亦然。
  • 您可以尝试将字符串 arrry 组装为{CategoriasContenidolds, {1,2,3}}
  • 是的,我想将 "1, 2, 6" 反序列化为 string[] { "1", "2", "6" }
  • 我已经尝试使用 PostgreSQL 函数 STRING_TO_ARRAY 将结果设为 {[CategoriasContenidoIds, {" 1"," 2"," 6"}]},但我仍然遇到同样的错误。
  • 能否请您 edit 将您的代码和 JSON 包含为 文本 而不是屏幕截图?此处要求不要为此使用图像,请参阅Discourage screenshots of code and/or errorsWhy not upload images of code on SO when asking a question 了解原因。一个可编译、可运行的 minimal reproducible example 会很棒,并且可以最大限度地提高有人提供帮助的机会。

标签: json asp.net-core serialization deserialization


【解决方案1】:

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

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 显式标记此属性,序列化程序将忽略它

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多