您使用的是Lift 1.0
JsCmd,它会生成带有单引号字符串的JSON,并尝试使用仅支持双引号字符串的scala解析器进行解析。
重要的是要意识到JSON有多个定义。
单引号字符串在JSON中有效吗?
- 他们根据ECMAscript第5版
- 它们不符合Crockford的原始RFC 4627
Lift和Scala提供了多种解析JSON的方法,有时版本之间的行为不同。
这些解析器接受的字符串不相等。
以下是一些用于生成和解析JSON字符串的方法的注释和示例。
使用[lift-json](https://github.com/lift/lift/tree/master/framework/lift-
base/lift-json/)库DSL 生产JSON
- 推荐的
- 尽管它的名字,这是一个独立的项目,与Lift的其余部分无关
例:
scala> import net.liftweb.json.JsonASTimport net.liftweb.json.JsonASTscala> import net.liftweb.json.JsonDSL._import net.liftweb.json.JsonDSL._scala> import net.liftweb.json.Printer._import net.liftweb.json.Printer._scala> val json1 = ("foo" -> 4) ~ ("bar" -> "baz")json1: net.liftweb.json.JsonAST.JObject = JObject(List(JField(foo,JInt(4)), JField(bar,JString(baz))))scala> compact(JsonAST.render(json1))res0: String = {"foo":4,"bar":"baz"}scala> val json2 = List(1,2,3)json2: List[Int] = List(1, 2, 3)scala> compact(JsonAST.render(json2))res1: String = [1,2,3]scala> val json3 = ("foo", 4) ~ ("bar", List(1,2,3))json3: net.liftweb.json.JsonAST.JObject = JObject(List(JField(foo,JInt(4)), JField(bar,JArray(List(JInt(1), JInt(2), JInt(3))))))scala> compact(JsonAST.render(json3))res2: String = {"foo":4,"bar":[1,2,3]}使用[lift-json](https://github.com/lift/lift/tree/master/framework/lift-
base/lift-json/)库解析JSON
- 推荐的
- 提供与scala案例类的隐式映射
- 当前不支持在控制台中定义的案例类(将抛出
com.thoughtworks.paranamer.ParameterNamesNotFoundException: Unable to get class bytes
) - 下面的示例使用
[PublicID](http://www.scala-lang.org/api/current/scala/xml/dtd/PublicID.html)
,一个预先存在的scala case类,以便它将在scala控制台上运行。
例:
scala> import scala.xml.dtd.PublicIDimport scala.xml.dtd.PublicIDscala> import net.liftweb.json._import net.liftweb.json._scala> import net.liftweb.json.JsonAST._import net.liftweb.json.JsonAST._scala> import net.liftweb.json.JsonDSL._import net.liftweb.json.JsonDSL._scala> implicit val formats = DefaultFormats formats: net.liftweb.json.DefaultFormats.type = net.liftweb.json.DefaultFormats$@7fa27eddscala> val jsonAst = ("publicId1" -> "idString") ~ ("systemId" -> "systemIdStr")jsonAst: net.liftweb.json.JsonAST.JObject = JObject(List(JField(publicId,JString(idString)), JField(systemId,JString(systemIdStr))))scala> jsonAst.extract[PublicID]res0: scala.xml.dtd.PublicID = PUBLIC "idString" "systemIdStr"在Scala 2.7.7和2.8.1中解析JSON
- 不推荐-“ 不再真正支持 ”
- Scala 2.7.7的解析器将不会解析单引号JSON
- 问题中使用的这种解析方法
例:
scala>import scala.util.parsing.json.JSON._import scala.util.parsing.json.JSON._scala> parseFull("{"foo" : 4 }") res1: Option[Any] = Some(Map(foo -> 4.0))scala> parseFull("[ 1,2,3 ]")res2: Option[Any] = Some(List(1.0, 2.0, 3.0))scala> parseFull("{'foo' : 4 }") res3: Option[Any] = None使用[util.JSONParser](http://main.scala-
tools.org/mvnsites/liftweb-2.0/framework/scaladocs/net/liftweb/util/JSONParser$object.html)在Lift
2.0和2.2中解析JSON
- 中性推荐
- Lift的util.JSONParser将解析单引号或双引号的JSON字符串:
例:
scala> import net.liftweb.util.JSONParser._import net.liftweb.util.JSONParser._scala> parse("{"foo" : 4 }") res1: net.liftweb.common.Box[Any] = Full(Map(foo -> 4.0))scala> parse("[ 1,2,3 ]")res2: net.liftweb.common.Box[Any] = Full(List(1.0, 2.0, 3.0))scala> parse("{'foo' : 4}")res3: net.liftweb.common.Box[Any] = Full(Map(foo -> 4.0))使用[json.JsonParser](http://main.scala-
tools.org/mvnsites/liftweb-2.0/framework/scaladocs/net/liftweb/json/JsonParser$object.html)在Lift
2.0和2.2中解析JSON
- 中性推荐
- Lift的json.JsonParser不会解析单引号JSON字符串:
例:
scala> import net.liftweb.json._import net.liftweb.json._scala> import net.liftweb.json.JsonParser._import net.liftweb.json.JsonParser._scala> parse("{"foo" : 4 }")res1: net.liftweb.json.JsonAST.JValue = JObject(List(JField(foo,JInt(4))))scala> parse("[ 1,2,3 ]")res2: net.liftweb.json.JsonAST.JValue = JArray(List(JInt(1), JInt(2), JInt(3)))scala> parse("{'foo' : 4}") net.liftweb.json.JsonParser$ParseException: unknown token 'Near: {'foo' : 4} at net.liftweb.json.JsonParser$Parser.fail(JsonParser.scala:216) at net.liftweb.json.JsonParser$Parser.nextToken(JsonParser.scala:308) at net.liftweb.json.JsonParser$$anonfun$1.apply(JsonParser.scala:172) at net.liftweb.json.JsonParser$$anonfun$1.apply(JsonParser.scala:129) at net.liftweb.json.JsonParse...使用Lift 1.0 JsCmd生产JSON
- 不推荐-输出对所有JSON解析器均无效
- 注意字符串周围的单引号:
例:
scala> import net.liftweb.http.js._import net.liftweb.http.js._scala> import net.liftweb.http.js.JE._import net.liftweb.http.js.JE._scala> JsObj(("foo", 4), ("bar", "baz")).toJsCmdres0: String = {'foo': 4, 'bar': 'baz'}scala> JsArray(1,2,3).toJsCmdres1: String = [1, 2, 3]scala> JsObj(("foo", 4), ("bar", JsArray(1,2,3))).toJsCmdres2: String = {'foo': 4, 'bar': [1, 2, 3]}使用Lift 2.0 JsCmd生产JSON
- 中性推荐
- 注意字符串周围的双引号:
例:
scala> import net.liftweb.http.js._import net.liftweb.http.js._scala> import net.liftweb.http.js.JE._import net.liftweb.http.js.JE._scala> JsObj(("foo", 4), ("bar", "baz")).toJsCmdres0: String = {"foo": 4, "bar": "baz"}scala> JsArray(1,2,3).toJsCmdres1: String = [1, 2, 3]scala> JsObj(("foo", 4), ("bar", JsArray(1,2,3))).toJsCmdres3: String = {"foo": 4, "bar": [1, 2, 3]}在Scala中生成JSON(已通过2.10测试)
- “ 不再真正支持 ”,但是它可以正常工作并且在那里。
例:
scala> import scala.util.parsing.json._import scala.util.parsing.json._scala> JSonObject (Map ("foo" -> 4, "bar" -> JSonArray (1 :: 2 :: 3 :: Nil))) .toString()res0: String = {"foo" : 4, "bar" : [1, 2, 3]}


