首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Scala / Lift中构造和解析JSON字符串

如何在Scala / Lift中构造和解析JSON字符串
EN

Stack Overflow用户
提问于 2009-05-29 20:28:15
回答 2查看 43.2K关注 0票数 55

我正在尝试使用JSON在浏览器和我的应用程序之间发送数据。

我正在尝试使用Lift 1.0来创建和解析JSON字符串,但由于某种原因,我无法解析我刚刚构造的JSON:

代码语言:javascript
复制
scala>import scala.util.parsing.json.JSON._
import scala.util.parsing.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> val json = JsObj(("foo", 4), ("bar", "baz")).toJsCmd
json: String = {'foo': 4, 'bar': 'baz'}

scala>  parseFull(json)  
res3: Option[Any] = None

如何在Scala/Lift中以编程方式构造也可以再次解析的有效JSON消息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-29 20:53:51

您正在使用Lift1.0的JsCmd,它生成带有单引号字符串的JSON,并尝试用scala的解析器解析它,它只支持双引号字符串。

重要的是要认识到JSON有多种定义。

单引号字符串在JSON中有效吗?

根据ECMAScript 5th Ed

  • They的说法,它们不是根据克罗克福德的原始RFC 4627

Lift和Scala提供了许多解析JSON的方法,有时在不同版本之间具有不同的行为。

这些解析器接受的字符串不是等效的。

以下是生成和解析JSON字符串的各种方法的一些注释和示例。

使用lift-json库DSL生成JSON

  • Recommended
  • Despite它的名字,这是一个独立的项目,不依赖于Lift

的其余部分

示例:

代码语言:javascript
复制
scala> import net.liftweb.json.JsonAST
import net.liftweb.json.JsonAST

scala> 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库解析JSON

当前不支持与控制台中定义的scala case-classes

  • Case-classes之间的
  • Recommended
  • Provides隐式映射(下面将抛出一个使用PublicIDcom.thoughtworks.paranamer.ParameterNamesNotFoundException: Unable to get class bytes)
  • The示例,这是一个预先存在的scala case类,以便它可以在scala控制台上工作。

示例:

代码语言:javascript
复制
scala> import scala.xml.dtd.PublicID
import scala.xml.dtd.PublicID

scala> 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$@7fa27edd

scala> 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

不推荐使用问题解析器- "No longer really supported"

  • Scala 2.7.7的解析器不会解析单引号的JSON

  • 此解析方法在

中使用

示例:

代码语言:javascript
复制
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解析Lift2.0和2.2中的JSON

  • 中性Recommendation
  • Lift's util.JSONParser将解析单引号或双引号的JSON字符串:

示例:

代码语言:javascript
复制
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解析Lift2.0和2.2中的JSON

  • 中性Recommendation
  • Lift's json.JsonParser不会解析单引号的JSON字符串:

示例:

代码语言:javascript
复制
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...

用Lift1.0 JsCmd生成JSON

不推荐使用

  • -输出不适用于所有的JSON解析器
  • 请注意字符串两边的单引号:

示例:

代码语言:javascript
复制
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")).toJsCmd
res0: String = {'foo': 4, 'bar': 'baz'}

scala> JsArray(1,2,3).toJsCmd
res1: String = 
[1, 2, 3]

scala>  JsObj(("foo", 4), ("bar", JsArray(1,2,3))).toJsCmd
res2: String = 
{'foo': 4, 'bar': [1, 2, 3]
}

用Lift2.0 JsCmd生成JSON

中性字符串周围的双引号:

示例:

代码语言:javascript
复制
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")).toJsCmd
res0: String = {"foo": 4, "bar": "baz"}

scala> JsArray(1,2,3).toJsCmd
res1: String = 
[1, 2, 3]

scala> JsObj(("foo", 4), ("bar", JsArray(1,2,3))).toJsCmd
res3: String = 
{"foo": 4, "bar": [1, 2, 3]
}

在scala中生成JSON (使用2.10进行了测试)

示例:

代码语言:javascript
复制
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]}
票数 89
EN

Stack Overflow用户

发布于 2016-05-29 02:52:23

看看Circe吧。它真的很好用,而且它利用了ShapelessCats的一些新工具。另外,你可以在Scala compiled to Javascript中使用它。

摘自Circe readme

scala>导入io.circe.,io.circe.generic.auto.,io.circe.parser.,io.circe.syntax。导入io.circe._导入io.circe.generic.auto._导入io.circe.parser._导入io.circe.syntax._

scala>密封特征Foo定义的特征Foo

scala> case类栏(xs: ListString)扩展了Foo定义的类栏

scala>案例类Qux(i: Int,d: OptionDouble)扩展了Foo定义的类Qux

scala> val foo: Foo = Qux(13,Some(14.0)) foo: Foo = Qux(13,Some(14.0))

scala> foo.asJson.noSpaces res0: String = {"Qux":{"d":14.0,"i":13}}

scala> decodeFoo res1: cats.data.Xorio.circe.Error,Foo = Right(Qux(13,Some(14.0)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/927983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档