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
Scala / Lift에서 다시 구문 분석 할 수있는 유효한 JSON 메시지를 프로그래밍 방식으로 어떻게 구성합니까?
JsCmd
작은 따옴표 문자열로 JSON을 생성하고 큰 따옴표 문자열 만 지원하는 스칼라의 파서로 구문 분석을 시도 하는 Lift 1.0의를 사용 하고 있습니다.
JSON에 대한 여러 정의가 있음을 인식하는 것이 중요합니다.
작은 따옴표로 묶인 문자열이 JSON에서 유효합니까?
- 그들은에 따라하는 인 ECMAScript 5 에드
- Crockford의 원래 RFC 4627 을 따르지 않습니다.
Lift와 Scala는 JSON을 구문 분석하는 다양한 방법을 제공하며 때로는 버전간에 동작이 다릅니다.
이러한 파서에서 허용하는 문자열은 동일하지 않습니다.
다음은 JSON 문자열을 생성하고 구문 분석하는 다양한 방법에 대한 몇 가지 설명과 예입니다.
lift-json 라이브러리 DSL로 JSON 생성
- 추천
- 이름에도 불구하고 이것은 나머지 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]}
lift-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"
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를 사용 하여 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를 사용 하여 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")).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]
}
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")).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 생성 (2.10으로 테스트)
- "No longer really supported", but it works and it's there.
example:
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]}
Take a look at Circe. It's really nice to use and it leverages some of the new tools from Shapeless and Cats. Plus, you can use it from Scala compiled to Javascript.
Taken from the Circe readme:
scala> import io.circe., io.circe.generic.auto., io.circe.parser., io.circe.syntax. import io.circe._ import io.circe.generic.auto._ import io.circe.parser._ import io.circe.syntax._
scala> sealed trait Foo defined trait Foo
scala> case class Bar(xs: List[String]) extends Foo defined class Bar
scala> case class Qux(i: Int, d: Option[Double]) extends Foo defined class 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.Xor[io.circe.Error,Foo] = Right(Qux(13,Some(14.0)))
ReferenceURL : https://stackoverflow.com/questions/927983/how-can-i-construct-and-parse-a-json-string-in-scala-lift
'development' 카테고리의 다른 글
C # 클래스 선언이 호출되기 전에 대괄호 안에있는 것은 무엇입니까? (0) | 2021.01.08 |
---|---|
Python에서 yield 표현식의 결과는 무엇입니까? (0) | 2021.01.08 |
온라인 RegexBuddy와 유사한 정규식 분석기가 있습니까? (0) | 2021.01.07 |
URL 값이있는 HTML 태그 속성의 전체 목록? (0) | 2021.01.07 |
IE는 서버에서 json 결과를 열거 나 저장하라는 메시지를 표시합니다. (0) | 2021.01.07 |