Как вернуть кастомный json в скалатре

Скалатра код:

import org.scalatra._
import org.json4s.{DefaultFormats, Formats}
import org.scalatra.json._


class AppServlet extends AppStack with JacksonJsonSupport{
  protected implicit lazy val jsonFormats: Formats = DefaultFormats

  private def generateJSON():((String, String),(String, String)) = {
    val json = ("Firstname" -> "joe", "LastName" -> "cole")
    json
  }

  before() {
    contentType = formats("json")
  }

  get("/") {
    generateJSON
  }
}

Я пытаюсь вернуть простой JSON, используя скалярные рамки, и на выходе что-то вроде этого {"_1":{"Firstname":"joe"},"_2":{"LastName":"cole"}}, Мне не нужно _1 или _2 для печати. Обратите внимание, я не пытаюсь вернуть какие-либо предметы. Мне просто нужно сделать свой собственный JSON, а затем вернуть его. Это не связано ни с какой моделью данных. Любая помощь приветствуется.

2 ответа

Решение

import org.scalatra._
import org.json4s.{DefaultFormats, Formats}
import org.scalatra.json._
import org.json4s._
import org.json4s.JsonDSL._

class AppServlet extends AppStack with JacksonJsonSupport{
  protected implicit lazy val jsonFormats: Formats = DefaultFormats

  private def generateJSON():JObject = {
    val json = ("Firstname" -> "joe") ~ ("LastName" -> "cole")
    json
  }

  get("/") {
    generateJSON
  }
}

То, что вы создаете, является кортежем (String, String)Не удивительно, что результат такой. Вы должны либо создать класс case, либо, так как вы используете json4s, вернуть:

// don't forget this:
// import org.json4s.JsonDSL._
("Firstname" -> "joe") ~ ("LastName" -> "cole")
Другие вопросы по тегам