YAML/JSON을 중간 스칼라 객체 형식으로 변환 할 수 있습니다. 뭐 그런 :
여기
scala> import net.jcazevedo.moultingyaml.DefaultYamlProtocol._
import net.jcazevedo.moultingyaml.DefaultYamlProtocol._
scala> import net.jcazevedo.moultingyaml._
import net.jcazevedo.moultingyaml._
scala> import spray.json.DefaultJsonProtocol._
import spray.json.DefaultJsonProtocol._
scala> import spray.json._
import spray.json._
scala> val jsonStr = "[1,2,3]"
jsonStr: String = [1,2,3]
scala> val jsonAst = jsonStr.parseJson
jsonAst: spray.json.JsValue = [1,2,3]
scala> val yamlAst = jsonAst.convertTo[List[Int]](spray.json.DefaultJsonProtocol.listFormat).toYaml(net.jcazevedo.moultingyaml.DefaultYamlProtocol.listFormat)
yamlAst: net.jcazevedo.moultingyaml.YamlValue = YamlArray(Vector(YamlNumber(1), YamlNumber(2), YamlNumber(3)))
scala> val yamlStr = yamlAst.prettyPrint
yamlStr: String =
"- 1
- 2
- 3
"
scala> val recoveredJsonAst = yamlAst.convertTo[List[Int]](net.jcazevedo.moultingyaml.DefaultYamlProtocol.listFormat).toJson(spray.json.DefaultJsonProtocol.listFormat)
recoveredJsonAst: spray.json.JsValue = [1,2,3]
scala> val recoveredJsonStr = recoveredJsonAst.prettyPrint
recoveredJsonStr: String = [1, 2, 3]
YAML의 AST는 도메인 객체 List[Int]
로 변환 한 후 JSON의 AST와 그 반대의 경우도 마찬가지입니다. AST간에 직접 변환을 할 수는 있지만 직접 작성해야합니다. 더 많은 작업이 필요하지만 더 나은 성능이 필요합니다.
YAML 라이브러리는 익숙한 JSON 라이브러리 인터페이스를 모방했지만 implicits를 다루는 것이 더욱 복잡해졌습니다. 또한 convertTo
과 같은 메서드는 그 때문에 해결하기가 어렵습니다.
scala> case class Test(v: Int)
defined class Test
scala> import net.jcazevedo.moultingyaml.DefaultYamlProtocol._
import net.jcazevedo.moultingyaml.DefaultYamlProtocol._
scala> import net.jcazevedo.moultingyaml._
import net.jcazevedo.moultingyaml._
scala> import spray.json.DefaultJsonProtocol._
import spray.json.DefaultJsonProtocol._
scala> import spray.json._
import spray.json._
scala> implicit val TestAsJson = jsonFormat1(Test)
TestAsJson: spray.json.RootJsonFormat[Test] = [email protected]
scala> implicit val TestAsYaml = yamlFormat1(Test)
TestAsYaml: net.jcazevedo.moultingyaml.YamlFormat[Test] = [email protected]
scala> val jsonStr = """{"v":1}"""
jsonStr: String = {"v":1}
scala> val jsonAst = jsonStr.parseJson
jsonAst: spray.json.JsValue = {"v":1}
scala> val yamlAst = jsonAst.convertTo[Test].toYaml
yamlAst: net.jcazevedo.moultingyaml.YamlValue = YamlObject(Map(YamlString(v) -> YamlNumber(1)))
scala> val yamlStr = yamlAst.prettyPrint
yamlStr: String =
"v: 1
"
scala> val recoveredJsonAst = yamlAst.convertTo[Test].toJson
recoveredJsonAst: spray.json.JsValue = {"v":1}
scala> val recoveredJsonStr = recoveredJsonAst.prettyPrint
recoveredJsonStr: String =
{
"v": 1
}
감사합니다. @aleksey 직접 AST-AST 솔루션을 요리했습니다. 일단 시험을 치면 여기에 게시 할 것이고 통과 할 것입니다. "모든"JSON 데이터를 지원해야합니다. – akauppi