Как сериализовать массив объектов в JSON JValue?

#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.