2015-10-27 5 views
1

Как разобрать json с помощью распылителя json, который использует футляр для змейки (обозначение подчеркивания) вместо случая верблюда?Как разобрать json с помощью распылителя json, который использует футляр для змейки (примечание подчеркивания) вместо верблюжьего футляра

E.g.

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

должно работать, а не исключать исключение.

ответ

1

Ответ получен от https://groups.google.com/forum/#!msg/spray-user/KsPIqWDK0AY/HcanflgRzMcJ. Положив его на СО, так как 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-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) 
} 
+0

def extractFieldNames() ничего не меняет ... Какая версия брызг-json используется здесь? –

+0

@ ÁkosVandra Erm 1.3.1 или ранее. – samthebest

+2

Да, подтвердите это. На самом деле мы столкнулись с несвязанной ошибкой scalac с неявным импортом. –

5

Как это:

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

Хитрость здесь jsonFormat функция принимает строковые аргументы для ключей объекта JSON.

+2

Спасибо, но я бы предпочел автоматический подход. У нас есть десятки классов, каждый из которых имеет десятки полей. – samthebest