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

我正在try 使用Lift 1.0创建和解析JSON字符串,但由于某些原因,我无法解析我刚才构建的JSON:

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消息?

推荐答案

You are using Lift 1.0's JsCmd, which produces JSON with single-quoted strings and attempting to parse it with scala's parser, which only supports double-quoted strings.

It is important to realize that there are multiple definitions for JSON.

Are single-quoted strings valid in JSON?

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

这些解析器接受的字符串不相等.

Here are some comments and examples of the various methods to product and parse JSON strings.


Producing JSON with the lift-json library DSL

  • 推荐
  • 尽管名称不同,但这是一个独立的项目,不依赖Lift的其他部分

示例:

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]}

Parsing JSON with the lift-json library

  • 推荐
  • 提供到Scala用例类/从Scala用例类的隐式映射
  • 控制台中定义的 case 类目前不受支持(将抛出com.thoughtworks.paranamer.ParameterNamesNotFoundException: Unable to get class bytes)
  • The example below uses PublicID, a pre-existing scala case-class so that it will work on the scala console.

示例:

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

  • Not 推荐 - "No longer really supported"
  • Scala 2.7.7's parser will not parse single-quoted 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

Parsing JSON in Lift 2.0 and 2.2 with util.JSONParser

  • 中性推荐
  • 电梯坏了.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))

Parsing JSON in Lift 2.0 and 2.2 with json.JsonParser

  • 中性推荐
  • 电梯是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

  • Not 推荐 - output not valid for all JSON parsers
  • Note the single-quotations around strings:

示例:

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]
}

Producing JSON with Lift 2.0 JsCmd

  • 中性推荐
  • 请注意字符串两边的双引号:

示例:

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]
}

Producing JSON in scala (tested with 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]}

Json相关问答推荐

对面的行/列进行排序时可能出现错误

将PNG图像保存为Python中的JSON文件

将JSON数组组织到菜单中

规范化JSON数据

当并非所有子对象都有 Select 器字段时 Select

go 语言中的 JSON 到 XML

正向闪烁后的微调值

JOLT 转换仅过滤一个字段

阅读 JSON 正文 Firebase 云函数

Angularjs访问本地json文件

Django - 异常处理最佳实践和发送自定义错误消息

JSON 到 JSON 转换器

是否可以将数据写入本地 json 文件,除了Angular 之外什么都没有?

在自定义 JsonConverter 的 ReadJson 方法中处理空对象

JSON JQ 如果没有 else

有没有办法折叠 Postman 中的所有 json 字段

可以在 SharedPreferences 中保存 JSON 数组吗?

确保数组中的项目属性在 Json Schema 中是唯一的?

python追加到json对象中的数组

如何在dart Flutter 中将json字符串转换为json对象?