标签: json4s

[json4s]:提取不同对象的数组

我使用的是Facebook图形API,响应看起来与此类似:

{
  "data": [
    {
      "id": "311620272349920_311718615673419", 
      "from": {
        "id": "1456046457993048", 
        "name": "Richard Ettinson"
      }, 
      "to": {
        "data": [
          {
            "id": "311620272349920", 
            "name": "Barbara Fallerman"
          }
        ]
      }, 
      "with_tags": {
        "data": [
          {
            "id": "311620272349920", 
            "name": "Barbara Fallerman"
          }
        ]
      }, 
      "message": "I was gong out with her", 
      "actions": [
        {
          "name": "Comment", 
          "link": "https://www.facebook.com/311620272349920/posts/311718615673419"
        }, 
        {
          "name": "Like", 
          "link": "https://www.facebook.com/311620272349920/posts/311718615673419"
        }
      ]
}
Run Code Online (Sandbox Code Playgroud)

我设法通过例如提取from字段

val extracted = (json \ "data" \"from").extract[PostFrom]
Run Code Online (Sandbox Code Playgroud)

但我担心如果我使用这种技术,我需要多次传递Json来提取我需要的所有值,这可能会导致性能不佳.

我怎样才能从非相似对象数组中将这些字段提取到案例类中?

我尝试了以下内容case classes: …

scala facebook-graph-api json4s

3
推荐指数
1
解决办法
1912
查看次数

如何使用json4s将JString转换为Int

我们最近从Jerkson切换到json4s,我们很快发现这两个库的默认反序列化行为远非相同.

我们遇到的一个问题是我们有时会收到json输入,其中数字字段表示为字符串而不是数字

//example json object with string representation of "id"
{
    "id" : "12545"
}


//example json object with number representation of "id"
{
    "id" : 12345
}
Run Code Online (Sandbox Code Playgroud)

这些需要反序列化到下面的类中

case class example(id:Int)
Run Code Online (Sandbox Code Playgroud)

这是我们将json反序列化为任意类的一般设置

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

object Json {
    implicit val formats = DefaultFormats
    def parse[T](json:String)(implicit mf: Manifest[T]):T =  {
        org.json4s.native.JsonMethods.parse(input).extract[T]
    }
}
Run Code Online (Sandbox Code Playgroud)

但每当我们尝试使用id的字符串表示形式解析json对象时,它会抛出异常并带有消息:

没有可用的优惠价值没有id的可用值不知道如何将JString(12545)转换为int

我一直在寻找一种为Integer字段设置自定义阅读器的方法,它试图将字符串解析为整数,但我还没有找到涵盖我们用例的解决方案.我们需要的是一般的捕获所有解决方案,以支持遗留应用程序.

谁知道如何实现这一目标?

json scala json4s

3
推荐指数
1
解决办法
4706
查看次数

在Scala json4s中获取一个字段

如何从Scala中的Json对象中获取特定字段?我觉得我要进入圈子.

import org.json4s._
import org.json4s.jackson.JsonMethods._

val me = parse(""" {"name":"brian", "state":"frustrated"} """)
Run Code Online (Sandbox Code Playgroud)

现在我只想要国家.我在寻找类似的东西

me("state") -> "frustrated"
Run Code Online (Sandbox Code Playgroud)

我试过了

me("state")
me.get("state")
me \ "state" <thanks for the idea>
me['state']
me.state
me.NOOOOOOOOOO!!!!!!!
Run Code Online (Sandbox Code Playgroud)

救命?

scala json4s

3
推荐指数
1
解决办法
1337
查看次数

Json4s在序列化期间忽略无字段(而不是使用'null')

我有一个使用的通用json序列化方法json4s.不幸的是,如果值是,则忽略字段None.我的目标是None用一个null值来表示字段.我尝试为无添加自定义序列化程序,但它仍然无法正常工作.

object test extends App {
          class NoneSerializer extends CustomSerializer[Option[_]](format => (
            {     
              case JNull => None
            },
            {
              case None => JNull

            }))

         implicit val f = DefaultFormats + new NoneSerializer

          case class JsonTest(x: String, y: Option[String], z: Option[Int], a: Option[Double], b: Option[Boolean], c:Option[Date], d: Option[Any])

          val v = JsonTest("test", None, None,None,None,None,None); 
println(Serialization.write(v))
}
Run Code Online (Sandbox Code Playgroud)

以上代码的结果:

{"x":"test"}
Run Code Online (Sandbox Code Playgroud)

我试过这个链接和其他一些,但是没有解决案例类的问题

json scala json4s

3
推荐指数
1
解决办法
2001
查看次数

如何使用json4s从akka-http响应实体读取json响应

我正在尝试调用谷歌地理编码API并检索响应.

lazy val geoCodingConnectionFlow: Flow[HttpRequest, HttpResponse, Any] =
  Http().outgoingConnectionHttps(config.getString("services.geoCodingApiHost"), config.getInt("services.geoCodingApiPort"))

def geoCodingRequest(request: HttpRequest): Future[HttpResponse] = Source.single(request).via(geoCodingConnectionFlow).runWith(Sink.head)
/**
 * This call to google service is limited
 * @see https://developers.google.com/maps/documentation/geocoding/#Limits
 */
def ?(l: GeoLocation)(implicit ec: ExecutionContext): Future[Either[String, List[Result]]] = {
  val latlang = s"17.3644264,78.3896741"
  import org.json4s.native.Serialization
  import org.json4s.NoTypeHints
  import akka.http.scaladsl.model._
  import akka.http.scaladsl.unmarshalling._
  implicit val materializer = ActorMaterializer()
  implicit val executor = system.dispatcher
  implicit val formats = Serialization.formats(NoTypeHints)
  geoCodingRequest(RequestBuilding.Get(s"${config.getString("services.geoCodingApiUrlPart")}?latlng=$latlang&key=${config.getString("services.geoCodingApiKey")}")).flatMap { response =>
    val nonBinaryType = ContentTypes.`application/json`
    def responseEntity: HttpEntity = response.entity
    response.status match …
Run Code Online (Sandbox Code Playgroud)

json scala json4s akka-http

3
推荐指数
1
解决办法
1万
查看次数

无法使用json4s将简单JSON提取到case类

我试图json4s在工作表中尝试使用它,我只想将json提取到某些case类:

import org.json4s.native.JsonMethods
import org.json4s.{DefaultFormats, Extraction, JValue}

case class Person(name: String, age: Int)
val json = """{"name":"joe","age":15}"""

JsonMethods.parse(json).extract[Person]
Run Code Online (Sandbox Code Playgroud)

scala json4s

3
推荐指数
1
解决办法
1301
查看次数

如何在 play.api.libs.json.JsValue 和 org.json4s.JValue 之间进行转换

我正在使用 Play Framework 来构建 API,但需要使用仅使用 Json4s 的库来执行一些验证和转换操作。

到目前为止,我唯一能够开始工作的是转换为字符串并使用目标库进行解析:

import org.json4s._
import org.json4s.jackson.JsonMethods._    
import play.api.libs.json._

val playJson: JsValue = Json.parse(compact(render(json4sJson)))
val json4sJson: JValue = parse(Json.stringify(playJson))
Run Code Online (Sandbox Code Playgroud)

但这显然是低效的,并且会产生丑陋的代码。有没有更好的办法?

scala playframework json4s play-json

3
推荐指数
1
解决办法
1951
查看次数

Json4s:转换为java.sql.Timestamp不起作用

我有一个案例类Ab.

case class Ab(
   startTime: java.sql.Timestamp)
Run Code Online (Sandbox Code Playgroud)

我得到了一个JSON表示.

 {"startTime":"2014-12-12 11:12:12"}
Run Code Online (Sandbox Code Playgroud)

Json4s显然不支持Timestamp,所以我创建了一个自定义序列化器,如:


case object TimestampSerializer extends CustomSerializer[Timestamp](format => (
  {
    case JString(s) => {
      Timestamp.valueOf(s)
    }
    case JNull => null
  },
  {
    case tm: Timestamp => JString(tm.toString())
  }))

但是,当我尝试提取值时,我得到一个映射异常.

我的代码


org.json4s.jackson.JsonMethods.parse(""" {"startTime":"2014-12-12 11:12:12"} """).toString
//JObject(List((startTime,JString(2014-12-12 11:12:12))))
org.json4s.jackson.JsonMethods.parse("""  {"startTime":"2014-12-12 11:12:12"} """).extract[Ab]
//MappingException: No usable value for startTime
//Invalid date '2014-12-12 11:12:12'

编写像这样的序列化工具:


case object TimestampSerializer extends CustomSerializer[Timestamp](format => (
  {
    case JInt(s) => {
      new Timestamp(s)
    }
    case JNull => null
  },
  { …
Run Code Online (Sandbox Code Playgroud)

json scala playframework-2.0 json4s

2
推荐指数
1
解决办法
1755
查看次数

Scala编译错误:"没有隐式视图可用"和"分散隐式扩展"

 def MyFun(result: ListBuffer[(String, DateTime, List[(String, Int)])]):
 String = {
 val json =
  (result.map {
    item => (
      ("subject" -> item._1) ~
        ("time" -> item._2) ~
        ("student" -> item._3.map {
          student_description=> (
            ("name" -> lb_result._1) ~
              ("age" -> lb_result._2) 
            )
        })
      )
    }
    )
    val resultFormat = compact(render(json))
    resultFormat  
}
Run Code Online (Sandbox Code Playgroud)

错误1:org.joda.time.DateTime => org.json4s.JsonAST.JValue没有隐式视图.("subject" - > item._1)〜

错误2:类型Nothing => org.json4s.JsonAST.JValue的分散隐式扩展从特征中的方法seq2jvalue开始JSONDSL val resultFormat = compact(render(json))

scala json4s

2
推荐指数
1
解决办法
1900
查看次数

如何编写处理集合的 json4s CustomSerializer

我有一个类,我试图使用 json4sCustomSerializer功能反序列化。由于json4s 无法反序列化可变集合,我需要这样做。

这是我要反序列化的类的基本结构(不用担心为什么类是这样的结构):

case class FeatureValue(timestamp:Double)

object FeatureValue{
  implicit def ordering[F <: FeatureValue] = new Ordering[F] {
    override def compare(a: F, b: F): Int = {
      a.timestamp.compareTo(b.timestamp)
    }
  }
}

class Point {
  val features = new HashMap[String, SortedSet[FeatureValue]]

  def add(name:String, value:FeatureValue):Unit = {
    val oldValue:SortedSet[FeatureValue] = features.getOrElseUpdate(name, SortedSet[FeatureValue]())
    oldValue += value
  }
}
Run Code Online (Sandbox Code Playgroud)

Json4s 序列化这个就好了。序列化实例可能如下所示:

{"features":
  {
   "CODE0":[{"timestamp":4.8828914447482E8}],
   "CODE1":[{"timestamp":4.8828914541333E8}],
   "CODE2":[{"timestamp":4.8828915127325E8},{"timestamp":4.8828910097466E8}]
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试编写自定义反序列化器,但我不知道如何处理列表尾部。在普通匹配器中,您可以递归调用自己的函数,但在这种情况下,该函数是匿名的,并且通过 json4s API 调用。我找不到任何涉及此问题的示例,也无法弄清楚。

目前,我只能匹配单个哈希键FeatureValue及其值中的单个实例。这是 CustomSerializer 的现状:

import org.json4s.{FieldSerializer, DefaultFormats, …
Run Code Online (Sandbox Code Playgroud)

functional-programming scala deserialization json4s

2
推荐指数
1
解决办法
4149
查看次数