如何使用不同类型的值创建Json对象?
我正在使用spray-json
这是代码
val images : List[JsObject] = fetchImageUrls(url).map((url: String) => {
JsObject(List(
"link_path" -> JsString(url),
"display_name" -> JsString("image"),
"size" -> JsString(""),
"modified" -> JsString(""),
"thumbnail" -> JsString(url),
"filename" -> JsString("image"),
"is_dir" -> JsBoolean(x = false),
"thumb_exists" -> JsBoolean(x = true)) )
})
val jsonAst: JsObject = JsObject(List(
"client" -> JsString("urlimages"),
"view" -> JsString("thumbnails"),
"contents" -> JsArray(images)
))
Run Code Online (Sandbox Code Playgroud)
它有效,但看起来很重.有没有办法用这样的代码定义json?
val images : List[List[(String, Any)]] = fetchImageUrls(url).map((url: String) => {
List(
"link_path" -> url,
"display_name" -> "image",
"size" -> "",
"modified" …Run Code Online (Sandbox Code Playgroud) 如何将带有下划线的json映射到案例类中的camelCase字段?
import org.json4s.jackson.JsonMethods.parse
import org.json4s.DefaultFormats
object Testing {
implicit val formats = DefaultFormats.withBigDecimal
def test = {
val json = parse("""{"some_field":"a value"}""")
json.extract[ThingDTO]
}
}
case class ThingDTO(someField:String)
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
someField没有可用值没有找到可以转换为java.lang.String的值
我有一个JSON文档,其中一些值可以为null.在json4s中使用for表达式,我怎么能产生None而不是什么?
下面将失败,得到当用于任一字段的值FormattedID或者PlanEstimate是null.
val j: json4s.JValue = ...
for {
JObject(list) <- j
JField("FormattedID", JString(id)) <- list
JField("PlanEstimate", JDouble(points)) <- list
} yield (id, points)
Run Code Online (Sandbox Code Playgroud)
例如:
import org.json4s._
import org.json4s.jackson.JsonMethods._
scala> parse("""{
| "FormattedID" : "the id",
| "PlanEstimate" : null
| }""")
res1: org.json4s.JValue = JObject(List((FormattedID,JString(the id)),
(PlanEstimate,JNull)))
scala> for {
| JObject(thing) <- res1
| JField("FormattedID", JString(id)) <- thing
| } yield id
res2: List[String] = List(the id)
scala> for {
| JObject(thing) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 json4s 解析 json 格式的不同类型的事件。我编写了一些案例类来表示所有继承自基类的不同事件Event:
abstract class Event{ def EventType : String }
case class StartSession(val EventType: String, val Platform: String) extends Event
case class AdView(val EventType: String, val EventSubtype: String) extends Event
Run Code Online (Sandbox Code Playgroud)
这是我用来解析事件的函数StartSession:
def parser(json: String): Event = {
val parsedJson = parse(json)
val s = parsedJson.extract[StartSession]
return s
}
Run Code Online (Sandbox Code Playgroud)
该函数将正确解析 json,例如{"EventType":"StartSession","Platform":"Portal"}
我正在寻找一种方法来概括解析器函数,以便我可以使用它来解析继承自的所有类型的事件Event,然后对函数的返回值进行模式匹配。
Spark依赖于json4s 3.2.10,但是这个版本有几个bug,我需要使用3.2.11.我在build.sbt中添加了json4s-native 3.2.11依赖,所有编译都很好.但是当我点火提交我的JAR时,它为我提供了3.2.10.
build.sbt
import sbt.Keys._
name := "sparkapp"
version := "1.0"
scalaVersion := "2.10.4"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.3.0" % "provided"
libraryDependencies += "org.json4s" %% "json4s-native" % "3.2.11"`
Run Code Online (Sandbox Code Playgroud)
plugins.sbt
logLevel := Level.Warn
resolvers += Resolver.url("artifactory", url("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")
Run Code Online (Sandbox Code Playgroud)
App1.scala
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.{Logging, SparkConf, SparkContext}
import org.apache.spark.SparkContext._
object App1 extends Logging {
def main(args: Array[String]) = {
val conf = new SparkConf().setAppName("App1")
val sc = new SparkContext(conf)
println(s"json4s version: ${org.json4s.BuildInfo.version.toString}")
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用json4s库在 Scala 中制作一个类序列化的简单示例,但即使在互联网上广泛搜索后,不幸的是我找不到任何可以解决我的问题的令人满意的示例。
基本上我有一个名为的简单类Person,我想从 JSON 字符串中提取该类的实例。
case class Person(
val name: String,
val age: Int,
val children: Option[List[Person]]
)
Run Code Online (Sandbox Code Playgroud)
所以当我这样做时:
val jsonStr = "{\"name\":\"Socrates\", \"age\": 70}"
println(Serialization.read[Person](jsonStr))
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
"Person(Socrates,70,None)" // works fine!
Run Code Online (Sandbox Code Playgroud)
但是当我的JSON 字符串中没有年龄参数时,我收到此错误:
线程“main”org.json4s.package$MappingException 中出现异常:年龄没有可用值
我知道该类Person在其构造函数中有两个必需参数,但我想知道是否有办法通过解析器或类似的东西进行此转换。
另外,我尝试过制作这个解析器,但没有成功。
预先感谢您的任何帮助。
我在我的一个新项目中使用 mongo-scala 组合,它需要反序列化带有日期字段的 mongo 文档
mongo 文档示例
{
"_id" : ObjectId("56603577616e082f559da3d9"),
"type" : "rule",
"startTime" : ISODate("2004-09-04T17:05:22.000Z"),
"finishTime" : ISODate("2005-09-04T18:06:22.000Z"),
"status" : "success"
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 mongo-scala-driver 来查询集合,并document.toJson()给我 json 字符串作为
{
"_id" : { "$oid" : "56603577616e082f559da3d9" },
"type" : "rule",
"startTime" : { "$date" : 1094317522000 },
"finishTime" : { "$date" : 1125857182000 },
"status" : "success"
}
Run Code Online (Sandbox Code Playgroud)
我需要将此 json 字符串反序列化为我的 Scala 案例类
case class Joblog (
_id : ObjectId,
type : String,
startTime: java.util.Date,
finishTime: java.util.Date,
status:String …Run Code Online (Sandbox Code Playgroud) scala mongodb mongo-scala-driver json4s jackson-module-scala
我在尝试使用 json4s 解析 JSON 时收到以下错误:
Non-standard token 'NaN': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow
Run Code Online (Sandbox Code Playgroud)
如何启用此功能?
我有这个代码
import com.fasterxml.jackson.annotation.JsonProperty
import org.json4s.DefaultFormats
import org.json4s.jackson.Serialization.{read, write}
object Testing extends App {
implicit val formats = DefaultFormats
val json =
"""
|{
|"1strange_field_name":"name"
|}
""".stripMargin
println(read[Test](json))
}
case class Test(@JsonProperty("1strange_field_name") testName: Option[String])
Run Code Online (Sandbox Code Playgroud)
它应该打印 Test(Some(name)) 但它打印 Test(None)。这是由于 json4s 没有使用 @JsonProperty 注释造成的。有没有办法配置 json4s 以使用 jackson 注释?
运行以下代码时,我预计会出现异常,但我None却得到了异常。这是预期的吗?
import org.json4s.jackson.JsonMethods
import org.json4s.{DefaultFormats, Formats}
implicit val f: Formats = DefaultFormats
val json ="{ \"a\" : { \"c\": 1 }}"
case class Foo(a: Option[String])
val foo = JsonMethods.parse(json).extract[Foo]
println(foo)
> Foo(None)
Run Code Online (Sandbox Code Playgroud)
还有那个代码:
import org.json4s.jackson.JsonMethods
import org.json4s.{DefaultFormats, Formats}
implicit val f: Formats = DefaultFormats
val json ="{ \"a\" : { \"c\": 1 }}"
case class Foo(a: String = "")
val foo = JsonMethods.parse(json).extract[Foo]
println(foo)
> Foo()
Run Code Online (Sandbox Code Playgroud) json4s ×10
scala ×10
json ×3
jackson ×2
apache-spark ×1
mongodb ×1
parsing ×1
sbt ×1
sbt-assembly ×1