我使用的是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: …
我们最近从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字段设置自定义阅读器的方法,它试图将字符串解析为整数,但我还没有找到涵盖我们用例的解决方案.我们需要的是一般的捕获所有解决方案,以支持遗留应用程序.
谁知道如何实现这一目标?
如何从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)
救命?
我有一个使用的通用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)
我试过这个链接和其他一些,但是没有解决案例类的问题
我正在尝试调用谷歌地理编码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) 我试图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) 我正在使用 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)
但这显然是低效的,并且会产生丑陋的代码。有没有更好的办法?
我有一个案例类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) 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))
我有一个类,我试图使用 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)