标签: json4s

如何使用不同类型的值创建Json对象?

如何使用不同类型的值创建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 scala json4s

5
推荐指数
1
解决办法
8318
查看次数

使用json4s在under_score和camelCase格式之间进行选择

如何将带有下划线的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的值

scala json4s json-deserialization

5
推荐指数
1
解决办法
2205
查看次数

使用for expression从可能为空的JSON值中提取选项

我有一个JSON文档,其中一些值可以为null.在json4s中使用for表达式,我怎么能产生None而不是什么?

下面将失败,得到当用于任一字段的值FormattedID或者PlanEstimatenull.

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)

json scala json4s

5
推荐指数
1
解决办法
2330
查看次数

如何解析 json 并根据其内容提取到不同的案例类

我正在尝试使用 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,然后对函数的返回值进行模式匹配。

scala json4s

5
推荐指数
1
解决办法
1331
查看次数

是否可以将json4s 3.2.11与Spark 1.3.0一起使用?

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)

scala sbt json4s sbt-assembly apache-spark

5
推荐指数
1
解决办法
1330
查看次数

在 Scala 中转换 JSON 对象时出现问题

我正在尝试使用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在其构造函数中有两个必需参数,但我想知道是否有办法通过解析器或类似的东西进行此转换。

另外,我尝试过制作这个解析器,但没有成功。

预先感谢您的任何帮助。

parsing json scala json4s

5
推荐指数
1
解决办法
8982
查看次数

将 mongo 文档的 DateField 反序列化为 java.util.Date

我在我的一个新项目中使用 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

5
推荐指数
0
解决办法
647
查看次数

使用 json4s 时如何设置 Jackson 解析器功能?

我在尝试使用 json4s 解析 JSON 时收到以下错误:

Non-standard token 'NaN': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow
Run Code Online (Sandbox Code Playgroud)

如何启用此功能?

scala jackson json4s

5
推荐指数
1
解决办法
4516
查看次数

Json4s 忽略 @JsonProperty jackson 注释

我有这个代码

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 注释?

scala jackson json4s

5
推荐指数
1
解决办法
660
查看次数

反序列化选项返回 None 而不是 json4s 中的异常

运行以下代码时,我预计会出现异常,但我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)

scala json4s

5
推荐指数
1
解决办法
450
查看次数