development

Scala / Lift에서 JSON 문자열을 생성하고 구문 분석하는 방법

big-blog 2021. 1. 7. 20:39
반응형

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에서 유효합니까?

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>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으로 테스트)

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

반응형