Scala+json4s解析首字符为数字的JSON字段的最优方案问询
方案1:使用Scala反引号标识符(最优解)
Scala原生支持用反引号包裹不符合命名规范的标识符,无需任何额外配置即可直接完成字段映射:
import org.json4s.jackson.JsonMethods._ import org.json4s._ implicit val formats = DefaultFormats val jsonStr = """{"5gLog":{"i":99}}""" val jval = parse(jsonStr) case class Raw5gLog(i: Int) // 反引号包裹特殊字段名 case class RawRecord(`5gLog`: Raw5gLog) // 直接正常解析即可 val rawRecord = jval.extract[RawRecord] // 访问字段时也需要带反引号:rawRecord.`5gLog`
优势:零额外代码、零配置、无性能损耗,完全适配原生解析逻辑。
注意点:后续访问该字段时也需要用反引号包裹标识符,介意的话可以选择方案2。
方案2:使用@JsonProperty注解做别名映射
如果希望保持代码命名符合Scala规范,不需要在调用时写反引号,可以通过Jackson的@JsonProperty注解指定JSON字段的别名:
import org.json4s.jackson.JsonMethods._ import org.json4s._ import com.fasterxml.jackson.annotation.JsonProperty implicit val formats = DefaultFormats val jsonStr = """{"5gLog":{"i":99}}""" val jval = parse(jsonStr) case class Raw5gLog(i: Int) case class RawRecord( // 注解指定JSON对应的真实字段名 @JsonProperty("5gLog") fivegLog: Raw5gLog ) val rawRecord = jval.extract[RawRecord] // 直接用正常命名访问:rawRecord.fivegLog
优势:代码命名符合规范,调用时无需特殊处理,可读性更高。
方案3:使用FieldSerializer批量映射特殊字段
如果有大量同类型的特殊字段需要处理,不想逐个加注解,可以通过json4s的FieldSerializer统一配置映射规则:
import org.json4s.jackson.JsonMethods._ import org.json4s._ import org.json4s.FieldSerializer // 定义反序列化时的字段映射规则:JSON字段名 -> 类参数名 val fieldMapping = FieldSerializer[RawRecord]( renameFrom = Map("5gLog" -> "fivegLog") ) // 把自定义序列化器加入全局配置 implicit val formats = DefaultFormats + fieldMapping val jsonStr = """{"5gLog":{"i":99}}""" val jval = parse(jsonStr) case class Raw5gLog(i: Int) case class RawRecord(fivegLog: Raw5gLog) val rawRecord = jval.extract[RawRecord]
优势:可以批量处理多个特殊字段,无需修改case class定义,适合字段规则统一的批量适配场景。
内容的提问来源于stack exchange,提问作者kmh
相关产品推荐
相关产品推荐

