我需要构建一个JSON字符串,如下所示:
[
{ 'id': 1, 'name': 'John'},
{ 'id': 2, 'name': 'Dani'}
]
val jArray = JsArray();
jArray += (("id", "1"), ("name", "John"))
jArray += (("id", "2"), ("name", "Dani"))
println(jArray.dump)
Run Code Online (Sandbox Code Playgroud)
我需要能够添加行jArray
,比如jArray += ...
最近的图书馆/解决方案是什么?
Ale*_*ean 203
不幸的是,编写JSON库是Scala社区编写todo列表应用程序的版本.
有很多种选择.我没有特别的顺序列出它们,附注:
§=有Scalaz集成,±=支持与Jackson的互操作 JsonNode
在除雪机,我们使用与杰克逊后端json4s; 我们也和Argonaut有过很好的经历.
fmp*_*ard 17
Lift-json的版本是2.6,它运行得非常好(并且也得到很好的支持,维护者随时准备修复用户可能发现的任何错误.你可以在github存储库中找到使用它的例子.
维护者(Joni Freeman)总是可以在Lift邮件列表中找到.邮件列表中还有其他用户也非常有帮助.
正如@Alexey指出的那样,如果您想将库与其他Scala版本一起使用2.11.x
,请更改scalaVersion
并使用%%
如下:
scalaVersion := "2.11.5"
"net.liftweb" %% "lift-json" % "2.6"
Run Code Online (Sandbox Code Playgroud)
您可以查看liftweb.net网站,了解随时间推移的最新版本.
par*_*tic 15
我建议使用jerkson,它支持大多数基本类型转换:
scala> import com.codahale.jerkson.Json._
scala> val l = List(
Map( "id" -> 1, "name" -> "John" ),
Map( "id" -> 2, "name" -> "Dani")
)
scala> generate( l )
res1: String = [{"id":1,"name":"John"},{"id":2,"name":"Dani"}]
Run Code Online (Sandbox Code Playgroud)
Ram*_*mon 10
名单上的第7名是杰克逊,不是杰克森.它支持Scala对象(案例类等).
以下是我如何使用它的示例.
object MyJacksonMapper extends JacksonMapper
val jsonString = MyJacksonMapper.serializeJson(myObject)
val myNewObject = MyJacksonMapper.deserializeJson[MyCaseClass](jsonString)
Run Code Online (Sandbox Code Playgroud)
这使得它非常简单.另外,XmlSerializer和对JAXB Annotations的支持非常方便.
这篇博文描述了它与JAXB Annotations和Play Framework的结合使用.
http://krasserm.blogspot.co.uk/2012/02/using-jaxb-for-xml-and-json-apis-in.html
这是我目前的JacksonMapper.
trait JacksonMapper {
def jsonSerializer = {
val m = new ObjectMapper()
m.registerModule(DefaultScalaModule)
m
}
def xmlSerializer = {
val m = new XmlMapper()
m.registerModule(DefaultScalaModule)
m
}
def deserializeJson[T: Manifest](value: String): T = jsonSerializer.readValue(value, typeReference[T])
def serializeJson(value: Any) = jsonSerializer.writerWithDefaultPrettyPrinter().writeValueAsString(value)
def deserializeXml[T: Manifest](value: String): T = xmlSerializer.readValue(value, typeReference[T])
def serializeXml(value: Any) = xmlSerializer.writeValueAsString(value)
private[this] def typeReference[T: Manifest] = new TypeReference[T] {
override def getType = typeFromManifest(manifest[T])
}
private[this] def typeFromManifest(m: Manifest[_]): Type = {
if (m.typeArguments.isEmpty) { m.erasure }
else new ParameterizedType {
def getRawType = m.erasure
def getActualTypeArguments = m.typeArguments.map(typeFromManifest).toArray
def getOwnerType = null
}
}
}
Run Code Online (Sandbox Code Playgroud)
也许我已经晚了一点,但你真的应该尝试从play框架中使用json库.你可以查看文档.在当前的2.1.1版本中,如果没有整个游戏2,则无法单独使用它,因此依赖关系将如下所示:
val typesaferepo = "TypeSafe Repo" at "http://repo.typesafe.com/typesafe/releases"
val play2 = "play" %% "play" % "2.1.1"
Run Code Online (Sandbox Code Playgroud)
它将为您带来所有东西的整体游戏框架.
但据我所知,Typesafe的人有计划在2.2版本中将其分开.所以,2.2-snapshot中有独立的play-json.
你应该检查Genson.它只是工作,并且比Scala中的大多数现有替代品更容易使用.它很快,具有许多功能并与其他一些库(jodatime,json4s DOM api ...)集成.
所有这些都没有任何花哨的不必要的代码,如implicits,基本案例的自定义读者/编写者,由于操作员超载导致的错误API ...
使用它就像:
import com.owlike.genson.defaultGenson_
val json = toJson(Person(Some("foo"), 99))
val person = fromJson[Person]("""{"name": "foo", "age": 99}""")
case class Person(name: Option[String], age: Int)
Run Code Online (Sandbox Code Playgroud)
免责声明:我是Gensons的作者,但这并不是我不客观:)
这是使用编写然后读取json
文件的基本实现json4s
.
import org.json4s._
import org.json4s.jackson.JsonMethods._
import org.json4s.JsonDSL._
import java.io._
import scala.io.Source
object MyObject { def main(args: Array[String]) {
val myMap = Map("a" -> List(3,4), "b" -> List(7,8))
// writing a file
val jsonString = pretty(render(myMap))
val pw = new PrintWriter(new File("my_json.json"))
pw.write(jsonString)
pw.close()
// reading a file
val myString = Source.fromFile("my_json.json").mkString
println(myString)
val myJSON = parse(myString)
println(myJSON)
// Converting from JOjbect to plain object
implicit val formats = DefaultFormats
val myOldMap = myJSON.extract[Map[String, List[Int]]]
println(myOldMap)
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
92265 次 |
最近记录: |