/ / Як розібрати json з розпилювачем json, який використовує змійку (символ підкреслення) замість верблюжої справи - json, scala, spray, spray-json

Як розібрати json з бризок json, який використовує зміюний випадок (підкреслення нотації) замість випадку верблюда - json, scala, spray, spray-json

Як розібрати json з розпиленням json, що використовує зміїну справу (підкреслення), а не верблюжий випадок?

Наприклад,

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

повинні працювати і не кидати винятку.

Відповіді:

6 за відповідь № 1

Подобається це:

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

Хитрість тут jsonFormat Функція приймає аргументи рядка для ключів об'єкта json.


1 для відповіді № 2

Ця відповідь взята з https://groups.google.com/forum/#!msg/spray-user/KsPIqWDK0AY/HcanflgRzMcJ. Покласти його на SO, так як SEO краще.

/**
* 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-zd])([A-Z])""".r
private val REPLACEMENT = "$1_$2"
}

object SnakifiedSprayJsonSupport extends SnakifiedSprayJsonSupport

import SnakifiedSprayJsonSupport._

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