【问题标题】:Need to deserialize the .toString representation of a complex Map[String, AnyRef] object需要反序列化复杂 Map[String, AnyRef] 对象的 .toString 表示
【发布时间】:2020-05-02 04:41:27
【问题描述】:

由于我的代码中的一个错误,我最终使用 .toString 序列化复杂的 Map[String, AnyRef] 对象,而我真正想要的是 JSON 序列化。现在我有了代表任意嵌套级别映射的字符串。

我的目标是在不丢失任何信息或尽可能少丢失信息的情况下将这些表示形式转换为 JSON。

我应该遵循什么方法来完成这个?

【问题讨论】:

  • 因为这只是恢复一些数据的临时修复。我会尝试将这些字符串作为文字映射粘贴到 Scala 文件中,并让 scalac 编译器来解释它们。
  • @LuisMiguelMejíaSuárez 这是一个有趣的想法。 toString 方法不输出编译器可以解析的字符串。但是,如果我将每个值都用双引号括起来,那么它可能会。这可以作为最后的手段,因为它的缺点是会自动丢失所有类型信息。

标签: scala deserialization data-loss


【解决方案1】:

这真的取决于你在这些Strings 中拥有什么。问题是.toString 自己丢失了一些信息:

@ Map("test" -> 1).toString
res1: String = "Map(test -> 1)"

@ Map("debug -> 2, test" -> 1).toString
res2: String = "Map(debug -> 2, test -> 1)"

@ Map("debug" -> 2, "test" -> 1).toString
res3: String = "Map(debug -> 2, test -> 1)"

您如何确定是否有来自res2res3 的案例?通常,如果您用作键的这些Strings 中的任何一个包含,,您将遇到一些问题,因为存在歧义或语法错误(如果您尝试解析事物)。

但是,如果您没有这些,您可以:

  • 使用.substring 删除初始Map( 和最终) *.split 使用 '","' 作为分隔符的结果
  • .map thw 结果到 .split 键值,trim 双方
  • 那么唯一的问题就是解析值(AnyRef不是很具体)。

或者:

  • 打开 Sublime Text(或任何其他带有multiline edition support 的编辑器)
  • 在此处粘贴您的代码
  • 选择 -> 并将其用于整个文件中的多行选择
  • 使用 ctrl+箭头在键周围添加 " 使其可解析 String
  • 如果需要,使用相同的方法调整AnyRefs
  • 将代码复制回 Scala 并评估

【讨论】:

  • 最后我决定使用 Scala 的FastParse 库来解析字符串。尽管它们大多是理智的,但我更喜欢使用更强大的解析机制来确保数据尽可能正确。我遭受的唯一数据丢失是在包含可能包含逗号的字符串的列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多