如何在json4s中轻松重命名字段名?从他们的文档,我已经尝试了以下代码片段,但它似乎没有重命名该serial字段id.
case class Person(serial: Int, firstName: String)
val rename = FieldSerializer[Person](renameTo("serial", "id"))
implicit val format = DefaultFormats + rename
write(Person(1, "Guest")) //returns {"serial":1,"firstName":"Guest"}
Run Code Online (Sandbox Code Playgroud)
使用Jackson库,通过声明注释很容易.但我正在寻找一个纯粹的scala库/解决方案.是否有更好的库或方法用于scala中的对象到json序列化,并且易于字段重命名?
我想支持提交到同一网址的几种不同的内容类型:
例如:
application/x-www-form-urlencoded,multipart/form-data,application/json
我想做的事情如下:
post {
contentType(`application/x-www-form-urlencoded`) |
contentType(`multipart/form-data`) {
// user POSTed a form
entity(as[MyCaseClass]) { data =>
complete { data.result }
}
} ~ contentType(`application/json`) {
// user POSTed a JSON object
entity(as[MyCaseClass]) { data =>
complete { data.result }
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为可能有一些方法可以使用自定义编组和解组,但我只需要在我的服务中的一两个位置,这看起来很简单.有人可以帮忙吗?
假设我有一个枚举或密封的案例对象组,如下所示:
sealed abstract class Status
case object Complete extends Status
case object Failed extends Status
case object Pending extends Status
case object Unknown extends Status
Run Code Online (Sandbox Code Playgroud)
要么
object Status extends Enumeration {
val Complete, Failed, Pending, Unknown = Value
}
Run Code Online (Sandbox Code Playgroud)
为这些创建json格式的最简单方法是什么,以便我可以非常容易地(以编程方式)生成json格式,以便在自定义JsonFormat工厂方法中使用,例如以下内容,适用于所有正常的案例类,字符串,集合等. ,但产生{}或{"name": null}上述两种类型的枚举?:
import org.json4s.DefaultFormats
import org.json4s.jackson.JsonMethods.parse
import org.json4s.jackson.Serialization
import org.json4s.jvalue2extractable
import org.json4s.string2JsonInput
trait JsonFormat[T] {
def read(json: String): T
def write(t: T): String
}
object JsonFormat {
implicit lazy val formats = DefaultFormats
def …Run Code Online (Sandbox Code Playgroud) 我spark 2.1.1和他有一个奇怪的问题json4s.jackson.
我升级了我的流媒体项目spark 1.5.1.现在当我在IDE中执行代码时,一切正常.
但之后assembly和代码独立执行spark-submit
我收到以下错误
Caused by: org.json4s.package$MappingException: Parsed JSON values do not match with class constructor
args=
arg types=
constructor=
Run Code Online (Sandbox Code Playgroud)
我的Environemnt:
- 火花= 2.1.1
- 阶= 2.11,
- json4s杰克逊= 3.2.11
以前有人遇到过同样的问题吗?如果是的话,你是怎么解决的?
非常感谢.
在json4s自述文件https://github.com/json4s/json4s#serializing-non-supported-types上给出的示例中,匹配仅在字段为order {"start":0,"end":0}时有效.如果交换了开始和结束字段,则匹配不起作用.无论如何都要编写下面的大小写匹配,以便JSON字段排序无关紧要?
case JObject(JField("start", JInt(s)) :: JField("end", JInt(e)) :: Nil)
Run Code Online (Sandbox Code Playgroud) 我有一个从我正在使用的REST服务返回的JSON.
{
"id": "6804",
"signatories": [
{
"id": "12125",
"fields": [
{
"type": "standard",
"name": "fstname",
"value": "John"
},
{
"type": "standard",
"name": "sndname",
"value": "Doe"
},
{
"type": "standard",
"name": "email",
"value": "john.doe@somwhere.com"
},
{
"type": "standard",
"name": "sigco",
"value": "Company"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
目前我正在研究一种用json4s解析它的方法,迭代"fields"数组,以便能够改变那里不同对象的属性"value".到目前为止,我已经尝试了一些json库,最终得到了json4s.
Json4s允许我将json解析为JObject,我可以尝试从中提取"fields"数组.
import org.json4s._
import org.json4s.native.JsonMethods._
// parse to JObject
val data = parse(json)
// extract the fields into a map
val fields = data \ "signatories" \ "fields"
// parse …Run Code Online (Sandbox Code Playgroud) 我有一个示例数组:
[{
"abc":"1",
"de":"1"
},
{
"fgh":"2",
"ij":"4"
}]
Run Code Online (Sandbox Code Playgroud)
这是一个org.json4s.JsonAST.JValue.
如何迭代数组中的每个对象,分别对每个对象进行操作?
以下测试片段
implicit val formats = DefaultFormats + FullTypeHints(Contacts.classList)
val serialized = Serialization.write(List(Mail(field = "random@mail.com", note = "Random note.")))
println(serialized)
Serialization.read[List[Contact[_]]](serialized).isInstanceOf[List[Mail]] should be (true)
Run Code Online (Sandbox Code Playgroud)
失败了
Can't find constructor for Contact[Object]
org.json4s.package$MappingException: Can't find constructor for Contact[Object]
at org.json4s.reflect.package$.fail(package.scala:95)
at org.json4s.reflect.ScalaSigReader$$anonfun$5.apply(ScalaSigReader.scala:21)
at org.json4s.reflect.ScalaSigReader$$anonfun$5.apply(ScalaSigReader.scala:21)
at scala.Option.getOrElse(Option.scala:121)
at org.json4s.reflect.ScalaSigReader$.readConstructor(ScalaSigReader.scala:21)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.ctorParamType(Reflector.scala:93)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3$$anonfun$15.apply(Reflector.scala:156)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3$$anonfun$15.apply(Reflector.scala:142)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3.apply(Reflector.scala:142)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$createConstructorDescriptors$3.apply(Reflector.scala:136)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.mutable.ArraySeq.foreach(ArraySeq.scala:74)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.createConstructorDescriptors(Reflector.scala:136)
at …Run Code Online (Sandbox Code Playgroud) 我有一些 scala 代码,需要能够使用 Json4s 序列化/反序列化一些 Java 类。
我正在使用"org.json4s" %% "json4s-ext" % "4.0.5","org.json4s" %% "json4s-jackson" % "4.0.5"虽然我也尝试过3.6.7版本。
模型代码(Java):
import com.fasterxml.jackson.annotation.JsonProperty;
public class Blah {
@JsonProperty("what")
public final String what;
public Blah() {
this(null);
}
public Blah(String what) {
this.what = what;
}
}
Run Code Online (Sandbox Code Playgroud)
序列化(Scala):
import org.json4s.DefaultFormats
import org.json4s.jackson.Serialization
println(Serialization.write(new Blah("helloooo!!!!"))(DefaultFormats))
Run Code Online (Sandbox Code Playgroud)
它只打印出:{}。
我知道我可以为每个 Java 类编写一个CustomSerializer,但我有很多 Java 类,并且真的想避免这样做。关于如何实现这项工作有什么想法吗?
我在尝试使用 json4s 解析 JSON 时收到以下错误:
Non-standard token 'NaN': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow
Run Code Online (Sandbox Code Playgroud)
如何启用此功能?
json4s ×10
scala ×9
json ×5
jackson ×2
apache-spark ×1
hive-serde ×1
java ×1
spray ×1
spray-dsl ×1