programing

Scala / Lift에서 JSON 문자열을 작성 및 해석하려면 어떻게 해야 합니까?

batch 2023. 4. 1. 08:36
반응형

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 1.0을 .JsCmd단일 따옴표로 묶은 문자열로 JSON을 생성하고 이중 따옴표로 묶은 문자열만 지원하는 스칼라의 파서로 해석하려고 합니다.

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 해석

  • 권장된
  • scala 케이스 클래스와의 암묵적인 매핑 제공
  • 는 현재되지 않습니다(「」를 슬로우 ).com.thoughtworks.paranamer.ParameterNamesNotFoundException: Unable to get class bytes)
  • 에서는 음음음 the를 합니다.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"

스칼라 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을 사용한 Lift 2.0 및 2.2의 JSON 해석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))

Lift 2.0 및 2.2의 JSON을 json과 함께 해석합니다.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 Recommended - 출력이 일부 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에서 테스트 완료)

  • " 이상 지원되지 않습니다." 하지만 작동하며 그대로 유지됩니다.

예:

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

Circe를 보세요.그것은 매우 사용하기 좋고 Shapeless와 Cats의 새로운 도구 중 일부를 활용합니다.또한 Scala 컴파일에서 Javascript로 사용할 수 있습니다.

Circe readme에서 가져온 내용:

scala > Import io.circe, io.circes.auto., io.circe.parser., io.circes.구문. Import io.circes._ import io.circe.syslog.auto._ import io.circce.parser.io.cir를 Import합니다.구문._

scala> sealed attribute Foo 정의 특성 Foo

scala> 케이스 클래스 바(xs: List[String])는 Foo 정의 클래스 바를 확장합니다.

scala> 케이스 클래스 Qx(i: Int, d: Option [ Double ])는 Foo 정의 클래스 Qx를 확장합니다.

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

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

scala > decodeFoo res1 : cats.data.Xor [io . circ ]오류, Foo] = 오른쪽(Qux(13, Some(14.0)))

언급URL : https://stackoverflow.com/questions/927983/how-can-i-construct-and-parse-a-json-string-in-scala-lift

반응형