2015-04-14 4 views
2

Я пишу Scala restful API и используя SprayJson для анализа JSON, который передается во время почтового вызова. Например, мы имеем структуру JSON, который выглядит следующим образом:Использование SprayJson, когда поля json являются необязательными

{"a", "b", "c", "d", "e", "f", "g", "h"} 

поля а, б, в и ч необходимы, но другие не являются. У меня есть собственный форматир JSON для класса case. По разным причинам способ структурирования класса case требует, чтобы я сделал пользовательский форматировщик JSON.

Вот фрагмент кода моей функции чтения в форматере:

def read(value: JsValue) = { 
    value.asJsObject.getFields("a", "b", "c", "d", "e", "f", "g", "h") 
    case Seq(JsString(a),JsString(b),JsString(c),JsString(d),JsString(e),JsString(f),JsString(g),JsString(h)) 
    new Object(a,b,c,d,e,f,g,h) 
    case _ => throw new DeserializationException("Object expected") 
} 

Как я могу реализовать выше, не имея многочисленные строки регистра соответствия все возможные перестановки полей, которые могут возникнуть в?

ответ

0

Я не знаком с распылением JSON, но если не существовавшие поля рассматриваются как своего рода JNull, то вы можете попробовать это:

implicit def JsValueToString(v: JsValue): String = v match { 
    case JsString(s) => s 
    case _ => null 
} 
... 
case Seq(JsString(a),JsString(b),JsString(c), dOpt, eOpt,fOpt,gOpt,JsString(h)) => 
    new Object(a,b,c,dOpt,eOpt,fOpt,gOpt,h) 
0

Нет необходимости писать свой собственный форматера, используйте вариант для дополнительных полей

case class Data(a: String, b: String, c: String, d: Option[String], e: 
Option[String], f: Option[String], g: Option[String], h: String) 

    jsonFormat8(Data) 
+0

Спасибо. Тем не менее, я пробовал этот подход на ранней стадии, и он не работает для моего конкретного случая. Я использую подход аннотации для своих классов case, чтобы преобразовать их в схему Avro, поэтому мой класс case определяется как таковой: case class (Data var a: String, var b: String и т. Д.) В настройке поля вверх как var, я больше не получаю данные, переданные в класс case из разбора JSON. Вы, или кто-либо еще знаете, подход, в котором я могу использовать один класс case, с пользовательским форматированием JSON, который будет принимать JSON (a, b, c, d, e, f, g, h) и JSON (a , b, c, f, h) в одной конструкции. - Спасибо, –

+0

Не работает для меня. Если я определяю jsonFormat8, но получаю только 7 полей (один из них был None), то у меня есть исключение – szefuf