如何解析json与喷json使用蛇案(下划线表示法)而不是骆驼案

时间:2015-10-27 12:25:57

标签: json scala spray spray-json

如何使用使用蛇形案例(下划线表示法)而非骆驼案例的喷涂json解析json?

E.g。

case class Test(subjectDescription: String)
"{\"subject_description\":\"Medicine\"}".parseJson.convertTo[Test]

应该可以工作而不会抛出异常。

2 个答案:

答案 0 :(得分:6)

像这样:

case class Test(subjectDescription: String)
implicit val testFormat = jsonFormat(Test.apply, "subject_description")
"{\"subject_description\":\"Medicine\"}".parseJson.convertTo[Test]

这里的技巧是jsonFormat函数为json对象键获取字符串参数。

答案 1 :(得分:1)

此答案取自https://groups.google.com/forum/#!msg/spray-user/KsPIqWDK0AY/HcanflgRzMcJ。因为SEO更好,所以把它放在SO上。

/**
 * A custom version of the Spray DefaultJsonProtocol with a modified field naming strategy
 */
trait SnakifiedSprayJsonSupport extends DefaultJsonProtocol {
  import reflect._

  /**
   * This is the most important piece of code in this object!
   * It overrides the default naming scheme used by spray-json and replaces it with a scheme that turns camelcased
   * names into snakified names (i.e. using underscores as word separators).
   */
  override protected def extractFieldNames(classTag: ClassTag[_]) = {
    import java.util.Locale

    def snakify(name: String) = PASS2.replaceAllIn(PASS1.replaceAllIn(name, REPLACEMENT), REPLACEMENT).toLowerCase(Locale.US)

    super.extractFieldNames(classTag).map { snakify(_) }
  }

  private val PASS1 = """([A-Z]+)([A-Z][a-z])""".r
  private val PASS2 = """([a-z\d])([A-Z])""".r
  private val REPLACEMENT = "$1_$2"
}

object SnakifiedSprayJsonSupport extends SnakifiedSprayJsonSupport

import SnakifiedSprayJsonSupport._

object MyJsonProtocol extends SnakifiedSprayJsonSupport {
  implicit val testFormat = jsonFormat1(Test.apply)
}