Подтвердить что ты не робот

Scala: Parse JSON непосредственно в класс case

Учитывая строку JSON и соответствующий ему класс case, какой простой способ проанализировать JSON в классе case? Доступно множество библиотек, но кажется, что Scala теперь может сделать это из коробки.

Как насчет того, следует ли разбирать JSON в списке класса case?

UPDATE:

Джеркссон, похоже, заброшен, и я не хочу устанавливать полную платформу Play или Lift или что-то еще тяжелое.

4b9b3361

Ответ 1

Есть несколько фреймворков, которые могут это сделать.

Цирцея

Используется много в наши дни. Много замечательных функций. Потянет кошек.

https://circe.github.io/circe/ https://github.com/circe/circe

JSON4s

JSON4s довольно зрелый и поддерживает Джексона или нативный JSON-Parser. Использовал его во многих проектах, чтобы заменить Джерксона.

https://github.com/json4s/json4s

играть-

JSONМожет использоваться без полного стека игры. Отличная поддержка в рамках игрового проекта в типосэйфе.

http://www.playframework.com/documentation/2.0/ScalaJson

Scala-Травление

Платформа сериализации. Существует возможность сериализации/и десериализации в JSON.

https://github.com/scala/pickling

Спрей JSON

Может искать и десериализовать. Нужно знать количество аргументов для десериализации жестких.

https://github.com/spray/spray-json

Ответ 2

Я использовал https://github.com/json4s/json4s, но до сих пор остается только https://github.com/json4s/json4s/issues/137

import org.json4s._
import org.json4s.native.JsonMethods._

implicit val formats = DefaultFormats

case class ParsedPage(crawlDate: String, domain:String, url:String, text: String)

val js = """ {
"crawlDate": "20150226",
"domain": "0x20.be",
"url": "http://0x20.be/smw/index.php?title=99_Bottles_of_Beer&oldid=6214",
"text": "99 Bottles of Beer From Whitespace (Hackerspace Gent) Revision as of 14:43, 8 August 2012 by Hans ( Talk | contribs ) 99 Bottles of Beer Where: Loading map... Just me, with 99 bottles of beer and some friends. Subpages"
}"""


parse(js).extract[ParsedPage]

Ответ 3

Используйте распылитель, поскольку он маленький.

import spray.json._
import DefaultJsonProtocol._


val json = """{"one" : "1", "two" : "2", "three" : "3"}""".parseJson

case class Numbers(one: String, two: String, three: String)

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val numbersFormat = jsonFormat3(Numbers)

}

import MyJsonProtocol._

val converted = json.convertTo[Numbers]

Загрузите спрей-json в sbt, используя этот файл build.sbt:

lazy val root = (project in file(".")). settings( name := "jsonExample", libraryDependencies += "io.spray" %% "spray-json" % "1.3.2" )

Ответ 4

Для тех, кто сталкивается с этим впервые, circe также является хорошим вариантом

val customerJson = s"""{"id" : "1", "name" : "John Doe"}"""
case class Customer(id: String, name: String)
val customer = decode[Customer](customerJson)

Ответ 5

Спрей Json довольно легкий и делает именно то, что вам нужно. Это инструментарий вместо полноценного фреймворка, и вы можете просто импортировать проект Spray-json вместо всего проекта.

https://github.com/spray/spray-json

Примеры могут помочь вам настроить очень быстро. В большинстве случаев ваш код для перевода в/из JSON заканчивается одним лайнером, но у вас есть возможность явно обрабатывать его, если у вас есть какие-то странные требования.

Ответ 6

Использовать net.liftweb

import net.liftweb.json._
case class Detail(username:String, password:String)
implicit val formats = DefaultFormats
val input = parse(jsonString).extract[Detail]
println(input.username)

Убедитесь, что версия Scala соответствует лифту-лифту. Напр. для Scala 2.10 используйте lift-json_2.10.

Ответ 7

Я второй конвертер JSON в Play Framework.

Также взгляните на Джексона, который зрелый. Обратите внимание, что вам понадобится использовать Jackson Scala Module: https://github.com/FasterXML/jackson-module-scala.

Достойная статья, предоставляющая интро - затем некоторый код для добавления неявных преобразований: https://coderwall.com/p/o--apg/easy-json-un-marshalling-in-scala-with-jackson