Scala 使用特殊字符喷洒json属性

Scala 使用特殊字符喷洒json属性,scala,spray,spray-json,Scala,Spray,Spray Json,我有json,其中属性名有一个特殊的字符。试图用json对其进行解析。下面是代码 如何将json@xml:lang中的属性名解析到case类中 import spray.json._ import DefaultJsonProtocol._ object SpecialCharInName extends App { case class Person(name: String, `@xml:lang`: String) val json = """ {"name":"MyName

我有json,其中属性名有一个特殊的字符。试图用json对其进行解析。下面是代码 如何将json@xml:lang中的属性名解析到case类中

import spray.json._
import DefaultJsonProtocol._

object SpecialCharInName extends App {

  case class Person(name: String, `@xml:lang`: String)

  val json = """ {"name":"MyName", "@xml:lang":"US"} """

  object PersonProtocol extends DefaultJsonProtocol {
    implicit val personFormat = jsonFormat2(Person)
  }

  import PersonProtocol._
  val person = json.parseJson
  val personClass = person.convertTo[Person]

  println(personClass)

}
上面的代码引发异常,如下所示

[error] (run-main-0) spray.json.DeserializationException: Object is missing required member '@xml$colonlang'
spray.json.DeserializationException: Object is missing required member '@xml$colonlang'
at spray.json.package$.deserializationError(package.scala:23)
at spray.json.ProductFormats$class.fromField(ProductFormats.scala:60)
at c.c.s.f.v.d.SpecialCharInName$PersonProtocol$.fromField(SpecialCharInName.scala:12)
at spray.json.ProductFormatsInstances$$anon$2.read(ProductFormatsInstances.scala:56)
at spray.json.ProductFormatsInstances$$anon$2.read(ProductFormatsInstances.scala:46)
at spray.json.JsValue.convertTo(JsValue.scala:31)
at c.c.s.f.v.d.SpecialCharInName$.delayedEndpoint$com$comcast$sv$fabric$vimond$domain$SpecialCharInName$1(SpecialCharInName.scala:20)
at c.c.s.f.v.d.SpecialCharInName$delayedInit$body.apply(SpecialCharInName.scala:6)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at c.c.s.f.v.d.SpecialCharInName$.main(SpecialCharInName.scala:6)
at c.c.s.f.v.d.SpecialCharInName.main(SpecialCharInName.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
Caused by: java.util.NoSuchElementException: key not found: @xml$colonlang
at scala.collection.MapLike$class.default(MapLike.scala:228)
at scala.collection.AbstractMap.default(Map.scala:59)
at scala.collection.MapLike$class.apply(MapLike.scala:141)
at scala.collection.AbstractMap.apply(Map.scala:59)
at spray.json.ProductFormats$class.fromField(ProductFormats.scala:57)
at c.c.s.f.v.d.SpecialCharInName$PersonProtocol$.fromField(SpecialCharInName.scala:12)
at spray.json.ProductFormatsInstances$$anon$2.read(ProductFormatsInstances.scala:56)
at spray.json.ProductFormatsInstances$$anon$2.read(ProductFormatsInstances.scala:46)
at spray.json.JsValue.convertTo(JsValue.scala:31)
at c.c.s.f.v.d.SpecialCharInName$.delayedEndpoint$com$comcast$sv$fabric$vimond$domain$SpecialCharInName$1(SpecialCharInName.scala:20)
at c.c.s.f.v.d.SpecialCharInName$delayedInit$body.apply(SpecialCharInName.scala:6)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at c.c.s.f.v.d.SpecialCharInName$.main(SpecialCharInName.scala:6)
at c.c.s.f.v.d.SpecialCharInName.main(SpecialCharInName.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
提前谢谢你的帮助

萨阿德

享受:)

简单地说,使用专用的
jsonFormat
方法,该方法接受一个生成器方法(如
apply
)和一个命名属性列表,这些属性必须出现在正在解析的JSON文档中。默认设置在您的情况下不太适用。

我想知道是否支持开箱即用。如果没有,请举出你的例子。
import spray.json._
import DefaultJsonProtocol._

object SpecialCharInName extends App {

  case class Person(name: String, `@xml:lang`: String)

  val json = """ {"name":"MyName", "@xml:lang":"US"} """

  object PersonProtocol extends DefaultJsonProtocol {
    implicit val personFormat = jsonFormat(Person.apply, "name", "@xml:lang")
  }

  import PersonProtocol._

  val person = json.parseJson
  val personClass = person.convertTo[Person]
  println(personClass)
}