如何用Scala按模式提取子串并修正JSON中column3字段的引号?
用Scala处理不合法JSON消息的解决方案
嘿,针对你提到的JSON消息处理需求,我整理了一套完整的Scala实现方案,专门解决这两个核心问题:分割独立的JSON条目,以及修复column3字段的格式问题。
首先,先明确咱们要处理的原始数据问题:你给出的示例是不合法的JSON片段——每个条目里的column3字段值既没有首尾双引号,内部还夹杂着未转义的双引号,直接用JSON解析库肯定报错。咱们分两步解决:
第一步:拆分独立的JSON条目
原始输入是用空格分隔的多个JSON对象,但直接按空格分割不太靠谱(万一JSON内部有空格就会出错)。所以咱们用正则匹配{...}的格式,精准提取每个独立的JSON条目。
第二步:修复column3的格式
对于每个条目中的column3,咱们要做两件事:
- 给字段值加上首尾双引号
- 把值内部的双引号替换成单引号(避免转义的麻烦,同时保证JSON合法)
完整Scala代码实现
下面是可直接运行的代码,包含详细的注释:
import scala.util.matching.Regex object JsonFixer { def main(args: Array[String]): Unit = { // 你的原始输入消息 val rawInput = """{"column1":"abc","column2":"123","column3":qwe"r"ty,"column4":"abc123"} {"column1":"defhj","column2":"45","column3":asd"f"gh,"column4":"def12d"}""" // 1. 提取所有独立的JSON条目(匹配{开头、}结尾的完整对象) val jsonEntryRegex: Regex = """\{[^{}]+\}""".r val invalidEntries = jsonEntryRegex.findAllIn(rawInput).toList // 2. 逐个修复每个条目中的column3字段 val fixedEntries = invalidEntries.map(fixColumn3Field) // 打印修复后的结果 println("修复后的合法JSON条目:") fixedEntries.foreach(println) } /** * 修复单个JSON条目中的column3字段 */ private def fixColumn3Field(invalidJson: String): String = { // 正则匹配column3字段的格式:捕获字段名和后面的原始值 val column3Regex: Regex = """("column3":)([^,}]+)""".r column3Regex.replaceAllIn(invalidJson, matchResult => { val fieldPrefix = matchResult.group(1) // 就是"column3:" val rawValue = matchResult.group(2) // 比如qwe"r"ty // 替换内部双引号为单引号,再包裹首尾双引号 val fixedValue = s""""${rawValue.replace("\"", "'")}"""" s"$fieldPrefix$fixedValue" }) } }
代码运行结果
执行后会输出两个合法的JSON对象:
{"column1":"abc","column2":"123","column3":"qwe'r'ty","column4":"abc123"} {"column1":"defhj","column2":"45","column3":"asd'f'gh","column4":"def12d"}
这些结果可以直接用Circe、Play JSON等Scala JSON库进行解析或后续处理。
内容的提问来源于stack exchange,提问作者Madhu045
相关产品推荐
相关产品推荐

