#arrays #json #scala #lift
#массивы #json #scala #поднимите
Вопрос:
Имея массив объектов, я хотел бы сериализовать их в JSON (экземпляр JValue). Я пробовал следующие 2 варианта объединения объектов JSON:
def items : Array[FooBar] = Array (new FooBar(1), new FooBar(2), new FooBar(3))
def toJson : JValue = {
val jItems : Array[JValue]= items.map(i => i.toJson)
// variant 1.
// val jItemsC = jItems.reduceLeft[JValue](_~_)
// variant 2.
val jItemsC = jItems.reduceLeft((a : JObject, b : JValue) => a ~ b)
"items" -> jItemsC
}
Первый (и второй с (a: JValue, b: JValue)) говорит
value ~ is not a member of net.liftweb.json.package.JValue
Второй говорит overloaded method value ~ with alternatives:
(right: net.liftweb.json.package.JObject)net.liftweb.json.JsonAST.JObject <and>
(right: (String, net.liftweb.json.package.JValue))net.liftweb.json.JsonAST.JObject
cannot be applied to (net.liftweb.json.package.JValue)
Итак, в чем проблема и как можно решить мою проблему?
Ответ №1:
Они должны работать:
val a = Array("a", "b", "c")
Extraction.decompose(a)
или
JArray(a.toList map JString.apply)
Комментарии:
1.
Extraction.decompose(a)
(где a — массив экземпляров моего класса) вызываетcould not find implicit value for parameter formats: net.liftweb.json.Formats
ошибку компиляции.2.
JArray(a.toList map JString.apply)
вызываетtype mismatch; found : String => net.liftweb.json.JsonAST.JString; required: code.model.Item => ?
ошибку компиляции.3.
JArray(a.toList)
кажется, работает (по крайней мере, компилируется), когда a представляет собой массив объектов JValue.