Scala / Lift で JSON 文字列を構築および解析するにはどうすればよいですか
質問
JSON を使用してブラウザとアプリの間でデータを送信しようとしています。
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
再解析も可能な有効な JSON メッセージを Scala/Lift でプログラム的に構築するにはどうすればよいですか?
解決
ご利用のリフト1.0の JsCmd
, を製造しているJSONシングル-引用文字列と、構文解析中でscalaのパーサは、サポートするだけでなくダブル-引用文字列です。
ことが重要でない複数の定義JSON.
シングル-引用文字列で有効なJSON?
- 彼によると ECMAScript5編
- なにCrockford独自の RFC4627
リフトやスカラを多くの方法での解析をJSON、時には異なる動作とします。
文字列を受け入れによるこれらのパーサは等価ではありません。
ここではコメントの例は、さまざまな方法で製品および構文解析JSON文字列です。
製造JSONの リフト-json 図書館DSL
- おすすめ
- その名前にもかかわらず、これは別のプロジェクトのない依存関係のリフト
例:
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]}
構文解析では、JSONの リフト-json 図書館
- おすすめ
- の提供を暗黙的にマッピングからスカーラの場合-授業
- ケース-授業に定義されたコンソールについては、対応する
com.thoughtworks.paranamer.ParameterNamesNotFoundException: Unable to get class bytes
) - 以下の例は、使用
PublicID
, は、既存のスカラ場合はクラスでのラノ-スカラ座です。
例:
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"
構文解析JSONにscala2.7.7と2.8.1
- 推奨されません-"なんの支援"
- Scala2.7.7のパーサはparse単価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
構文解析JSONにフ2.0 2.2と util.JSONParser
- 中性の推薦
- リフトの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にフ2.0 2.2と 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...
生産は、JSONフ1.0JsCmd
- 推奨されません-出力に有効でないすべての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")).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]
}
生産は、JSONフ2.0JsCmd
- 中性の推薦
- この場合は、引用周辺の文字列:
例:
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]
}
製造JSONにscala(試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]}
他のヒント
を見てみましょう キルケ. 。とても使いやすく、次の新しいツールをいくつか活用しています。 形のない そして 猫. 。さらに、次から使用できます。 JavaScript にコンパイルされた Scala.
から抜粋 キルケのreadme:
スカラ>インポートio.circe。, 、io.circe.generic.auto。, 、io.circe.parser。、io.circe.syntax。 io.circe._インポートio.circe.generic.auto._ import io.circe.parser._ import io.circe.syntax._
scala> sealed trait Foo 定義された特性 Foo
scala> ケースクラス Bar(xs:List[String]) Foo 定義のクラス Bar を拡張します。
scala> ケースクラス Qux(i:整数、d:オプション[double])は、Foo定義されたクラスquxを拡張します
スカラ> val foo:Foo = Qux(13, Some(14.0)) foo:foo = qux(13、some(14.0))
スカラ> foo.asJson.noSpaces res0:文字列 = {"Qux":{"d":14.0,"i":13}}
scala> decodeFoo res1:cat.data.Xor[io.circe.Error,Foo] = Right(Qux(13,Some(14.0)))