복붙노트

[SCALA] 스칼라 어떤 JSON 라이브러리를 사용 하는가? [닫은]

SCALA

스칼라 어떤 JSON 라이브러리를 사용 하는가? [닫은]

나는이 같은 JSON 문자열, 뭔가를 구축해야합니다 :

[
  { 'id': 1, 'name': 'John'},
  { 'id': 2, 'name': 'Dani'}
]

val jArray = JsArray();
jArray += (("id", "1"), ("name", "John"))
jArray += (("id", "2"), ("name", "Dani"))
println(jArray.dump)

나는는 jarray로는 jarray + = 같은 것을 행을 추가 할 수 있어야합니다 ...

이 가장 가까운 도서관 / 솔루션은 무엇인가?

해결법

  1. ==============================

    1.불행하게도 할 일 목록 응용 프로그램을 코딩의 스칼라 사회의 버전을 JSON 라이브러리입니다 작성.

    불행하게도 할 일 목록 응용 프로그램을 코딩의 스칼라 사회의 버전을 JSON 라이브러리입니다 작성.

    대안 꽤 여러 가지가 있습니다. 나는 메모와 함께, 특별한 순서대로 나열 :

    =를 §하는 Scalaz 통합을 가지고, ±는 = 잭슨 JsonNode와 상호 운용성을 지원합니다

    제설기에서 우리는 잭슨 백 엔드와 json4s를 사용; 우리는 너무 모험가와 함께 좋은 경험을 했어.

  2. ==============================

    2.리프트 - JSON 버전 2.6에 있고 정말 잘 작동 (도 아주 잘 지원하고, 메인테이너는 항상 사용자가 찾을 수있는 버그를 수정 할 준비가되어 있습니다. 당신은 GitHub의 저장소에 그것을 사용 예제를 찾을 수 있습니다

    리프트 - JSON 버전 2.6에 있고 정말 잘 작동 (도 아주 잘 지원하고, 메인테이너는 항상 사용자가 찾을 수있는 버그를 수정 할 준비가되어 있습니다. 당신은 GitHub의 저장소에 그것을 사용 예제를 찾을 수 있습니다

    유지 보수를하는 (조니 프리먼)는 항상 리프트 메일 링리스트에 연결할 수 있습니다. 뿐만 아니라 매우 도움이 메일 링리스트에있는 다른 사용자도 있습니다.

    @Alexey가 지적 하듯이 다른 스칼라 버전의 라이브러리를 사용하려는 경우, 2.11.x, 변경 scalaVersion 말을 다음과 같이 %% 사용

    scalaVersion := "2.11.5" 
    
    "net.liftweb" %% "lift-json" % "2.6"
    

    당신은 시간이 지남에 따라 최신 버전을 알 수 있습니다 liftweb.net 사이트를 확인할 수 있습니다.

  3. ==============================

    3.내가 jerkson을 사용하는 것이 좋습니다, 그것은 가장 기본적인 형식 변환을 지원합니다 :

    내가 jerkson을 사용하는 것이 좋습니다, 그것은 가장 기본적인 형식 변환을 지원합니다 :

    scala> import com.codahale.jerkson.Json._
    
    scala> val l = List( 
                     Map( "id" -> 1, "name" -> "John" ),
                     Map( "id" -> 2, "name" -> "Dani")
                   )
    
    scala> generate( l )
    
    res1: String = [{"id":1,"name":"John"},{"id":2,"name":"Dani"}]
    
  4. ==============================

    4.목록에있는 번호 7 Jerkson를 사용하지 않는, 잭슨입니다. 그것은 스칼라 객체 (케이스 클래스 등)에 대한 지원을하고있다.

    목록에있는 번호 7 Jerkson를 사용하지 않는, 잭슨입니다. 그것은 스칼라 객체 (케이스 클래스 등)에 대한 지원을하고있다.

    아래는 내가 그것을 사용하는 방법의 예입니다.

    object MyJacksonMapper extends JacksonMapper
    val jsonString = MyJacksonMapper.serializeJson(myObject)
    val myNewObject = MyJacksonMapper.deserializeJson[MyCaseClass](jsonString)
    

    이것은 매우 간단합니다. 또한 XmlSerializer를하고 JAXB 주석에 대한 지원이 매우 편리합니다.

    이 블로그 게시물은 JAXB 주석과 플레이 프레임 워크를 사용하는 것에 대해 설명합니다.

    http://krasserm.blogspot.co.uk/2012/02/using-jaxb-for-xml-and-json-apis-in.html

    여기에 내 현재 JacksonMapper이다.

    trait JacksonMapper {
    
      def jsonSerializer = {
        val m = new ObjectMapper()
        m.registerModule(DefaultScalaModule)
        m
      }
    
      def xmlSerializer = {
        val m = new XmlMapper()
        m.registerModule(DefaultScalaModule)
        m
      }
    
      def deserializeJson[T: Manifest](value: String): T = jsonSerializer.readValue(value, typeReference[T])
      def serializeJson(value: Any) = jsonSerializer.writerWithDefaultPrettyPrinter().writeValueAsString(value)
      def deserializeXml[T: Manifest](value: String): T = xmlSerializer.readValue(value, typeReference[T])
      def serializeXml(value: Any) = xmlSerializer.writeValueAsString(value)
    
      private[this] def typeReference[T: Manifest] = new TypeReference[T] {
        override def getType = typeFromManifest(manifest[T])
      }
    
      private[this] def typeFromManifest(m: Manifest[_]): Type = {
         if (m.typeArguments.isEmpty) { m.erasure }
         else new ParameterizedType {
           def getRawType = m.erasure
    
           def getActualTypeArguments = m.typeArguments.map(typeFromManifest).toArray
    
           def getOwnerType = null
         }
      }
    }   
    
  5. ==============================

    5.어쩌면 내가 조금 늦게했습니다,하지만 당신은 정말 플레이 프레임 워크에서 JSON 라이브러리를 사용하려고합니다. 당신은 문서를 볼 수 있었다. 현재 2.1.1 버전에서는 별도로 전체 재생이없이 사용할 수 없게 의존성의 뜻은 다음과 같다 :

    어쩌면 내가 조금 늦게했습니다,하지만 당신은 정말 플레이 프레임 워크에서 JSON 라이브러리를 사용하려고합니다. 당신은 문서를 볼 수 있었다. 현재 2.1.1 버전에서는 별도로 전체 재생이없이 사용할 수 없게 의존성의 뜻은 다음과 같다 :

    val typesaferepo  = "TypeSafe Repo" at "http://repo.typesafe.com/typesafe/releases"
    val play2 = "play" %% "play" % "2.1.1"
    

    그것은 보드의 모든 물건을 당신에게 전체 플레이 프레임 워크를 가져올 것이다.

    하지만 형태 보증에서 사람을 알고 2.2 릴리스에서 분리 할 계획을 가지고있다. 그래서, 2.2 스냅 샷에서 독립 플레이 JSON이있다.

  6. ==============================

    6.당신은 Genson을 확인해야합니다. 그냥 작동 스칼라의 기존 대안의 대부분보다 사용하기 훨씬 쉽습니다. 그것은 빠르고, 다른 libs와 많은 기능과 통합이 (jodatime을 ... DOM API를 json4s).

    당신은 Genson을 확인해야합니다. 그냥 작동 스칼라의 기존 대안의 대부분보다 사용하기 훨씬 쉽습니다. 그것은 빠르고, 다른 libs와 많은 기능과 통합이 (jodatime을 ... DOM API를 json4s).

    모든 인해 운영자 과부하에 기본 경우, illisible API에 대한 implicits, 사용자 정의 리더 / 라이터와 같은 어떤 공상 불필요한 코드없이 ...

    그것뿐만 아니라 쉽게 사용 :

    import com.owlike.genson.defaultGenson_
    
    val json = toJson(Person(Some("foo"), 99))
    val person = fromJson[Person]("""{"name": "foo", "age": 99}""")
    
    case class Person(name: Option[String], age: Int)
    

    면책 조항 : 나는 Gensons의 저자,하지만 내가 목표 아니다 의미하지 않는다 :)

  7. ==============================

    7.여기에 쓰기의 기본 구현은 다음 json4s를 사용하여 JSON 파일을 읽고.

    여기에 쓰기의 기본 구현은 다음 json4s를 사용하여 JSON 파일을 읽고.

    import org.json4s._
    import org.json4s.jackson.JsonMethods._
    import org.json4s.JsonDSL._
    import java.io._
    import scala.io.Source
    
    
    object MyObject { def main(args: Array[String]) {
    
      val myMap = Map("a" -> List(3,4), "b" -> List(7,8))
    
      // writing a file 
      val jsonString = pretty(render(myMap))
    
      val pw = new PrintWriter(new File("my_json.json"))
      pw.write(jsonString)
      pw.close()
    
      // reading a file 
      val myString = Source.fromFile("my_json.json").mkString
      println(myString)
    
      val myJSON = parse(myString)
    
      println(myJSON)
    
      // Converting from JOjbect to plain object
      implicit val formats = DefaultFormats
      val myOldMap = myJSON.extract[Map[String, List[Int]]]
    
      println(myOldMap)
     }
    }
    
  8. ==============================

    8.Jawn 스칼라에서 매우 유연 JSON 파서 라이브러리입니다. 또한 사용자 정의하는 AST의 생성을 할 수 있습니다; 당신은 단지 AST에 매핑 할 작은 특성 함께 제공해야합니다.

    Jawn 스칼라에서 매우 유연 JSON 파서 라이브러리입니다. 또한 사용자 정의하는 AST의 생성을 할 수 있습니다; 당신은 단지 AST에 매핑 할 작은 특성 함께 제공해야합니다.

    JSON 파싱 약간의 필요한 최근의 프로젝트에 대 한 좋은 일했다.

  9. ==============================

    9.휴거는 답변 목록에없는 것 같습니다. 그것은 http://rapture.io/에서 얻은에 (다른 것은 사이)을 허용 할 수 있습니다 :

    휴거는 답변 목록에없는 것 같습니다. 그것은 http://rapture.io/에서 얻은에 (다른 것은 사이)을 허용 할 수 있습니다 :

    나는 복사 / 그것의 페이지에서 휴거 예제를 붙여 넣을하지 않습니다. 휴거의 기능에 대한 좋은 프리젠 테이션이 예쁜 SBTB 2014에서 존에 의해 주어졌다 : https://www.youtube.com/watch?v=ka5-OLJgybI

  10. ==============================

    10.@ AlaxDean의 # 7 대답은 모험가 내가 SBT와 IntelliJ를 신속하게 작업을 얻을 수 있었다 유일합니다. 사실 또한 약간의 시간이 걸렸습니다하지만 원시 AST 다루는 것은 내가 원하는 것이 아니다 json4s. 내 build.st에 한 줄에 넣어 작동하는 모험가 가지고 :

    @ AlaxDean의 # 7 대답은 모험가 내가 SBT와 IntelliJ를 신속하게 작업을 얻을 수 있었다 유일합니다. 사실 또한 약간의 시간이 걸렸습니다하지만 원시 AST 다루는 것은 내가 원하는 것이 아니다 json4s. 내 build.st에 한 줄에 넣어 작동하는 모험가 가지고 :

    libraryDependencies + = "io.argonaut"%% "모험가"% "6.0.1"

    그것은 내가 JSON을 얻을 수 있다면 그리고 간단한 테스트를 확인합니다 :

    package mytest
    
    
    import scalaz._, Scalaz._
    import argonaut._, Argonaut._
    
    object Mytest extends App {
    
      val requestJson  =
        """
        {
          "userid": "1"
        }
        """.stripMargin
    
      val updatedJson: Option[Json] = for {
        parsed <- requestJson.parseOption
      } yield ("name", jString("testuser")) ->: parsed
    
      val obj = updatedJson.get.obj
      printf("Updated user: %s\n", updatedJson.toString())
      printf("obj : %s\n", obj.toString())
      printf("userid: %s\n", obj.get.toMap("userid"))
    }
    

    그리고

    $ sbt
    > run
    Updated user: Some({"userid":"1","name":"testuser"})
    obj : Some(object[("userid","1"),("name","testuser")])
    userid: "1"
    

    당신은 또한 null이 될 수있는 값 (null의 안전 같아요)이 단지 인 옵션에 대해 잘 알고 있어야합니다. 당신이 뭔가를 볼 경우 기호 \ / (AN 또는 운전) 아마 Scalaz처럼 이해하지 않도록 모험가는 Scalaz를 사용합니다.

  11. ==============================

    11.이 시도 할 수 있습니다 : https://github.com/momodi/Json4Scala

    이 시도 할 수 있습니다 : https://github.com/momodi/Json4Scala

    그것은 간단하고, 300 개 인 미만 라인 코드를 하나 개의 스칼라 파일이 있습니다.

    샘플이 있습니다 :

    test("base") {
        assert(Json.parse("123").asInt == 123)
        assert(Json.parse("-123").asInt == -123)
        assert(Json.parse("111111111111111").asLong == 111111111111111l)
        assert(Json.parse("true").asBoolean == true)
        assert(Json.parse("false").asBoolean == false)
        assert(Json.parse("123.123").asDouble == 123.123)
        assert(Json.parse("\"aaa\"").asString == "aaa")
        assert(Json.parse("\"aaa\"").write() == "\"aaa\"")
    
        val json = Json.Value(Map("a" -> Array(1,2,3), "b" -> Array(4, 5, 6)))
        assert(json("a")(0).asInt == 1)
        assert(json("b")(1).asInt == 5)
    }
    test("parse base") {
        val str =
            """
              {"int":-123, "long": 111111111111111, "string":"asdf", "bool_true": true, "foo":"foo", "bool_false": false}
            """
        val json = Json.parse(str)
        assert(json.asMap("int").asInt == -123)
        assert(json.asMap("long").asLong == 111111111111111l)
        assert(json.asMap("string").asString == "asdf")
        assert(json.asMap("bool_true").asBoolean == true)
        assert(json.asMap("bool_false").asBoolean == false)
        println(json.write())
        assert(json.write().length > 0)
    }
    test("parse obj") {
        val str =
            """
               {"asdf":[1,2,4,{"bbb":"ttt"},432]}
            """
        val json = Json.parse(str)
        assert(json.asMap("asdf").asArray(0).asInt == 1)
        assert(json.asMap("asdf").asArray(3).asMap("bbb").asString == "ttt")
    }
    test("parse array") {
        val str =
            """
               [1,2,3,4,{"a":[1,2,3]}]
            """
        val json = Json.parse(str)
        assert(json.asArray(0).asInt == 1)
        assert(json(4)("a")(2).asInt == 3)
        assert(json(4)("a")(2).isInt)
        assert(json(4)("a").isArray)
        assert(json(4)("a").isMap == false)
    }
    test("real") {
        val str = "{\"styles\":[214776380871671808,214783111085424640,214851869216866304,214829406537908224],\"group\":100,\"name\":\"AO4614【金宏达电子】现货库存 质量保证 欢迎购买@\",\"shopgrade\":8,\"price\":0.59,\"shop_id\":60095469,\"C3\":50018869,\"C2\":50024099,\"C1\":50008090,\"imguri\":\"http://img.geilicdn.com/taobao10000177139_425x360.jpg\",\"cag\":50006523,\"soldout\":0,\"C4\":50006523}"
        val json = Json.parse(str)
        println(json.write())
        assert(json.asMap.size > 0)
    }
    
  12. ==============================

    12.나는 그것이 중첩 된 경우 클래스를 자동으로 처리 할 큰 장점을 가지고 uPickle을 사용합니다 :

    나는 그것이 중첩 된 경우 클래스를 자동으로 처리 할 큰 장점을 가지고 uPickle을 사용합니다 :

    object SerializingApp extends App {
    
      case class Person(name: String, address: Address)
    
      case class Address(street: String, town: String, zipCode: String)
    
      import upickle.default._
    
      val john = Person("John Doe", Address("Elm Street 1", "Springfield", "ABC123"))
    
      val johnAsJson = write(john)
      // Prints {"name":"John Doe","address":{"street":"Elm Street 1","town":"Springfield","zipCode":"ABC123"}}
      Console.println(johnAsJson)
    
      // Parse the JSON back into a Scala object
      Console.println(read[Person](johnAsJson))  
    }
    

    uPickle를 사용하도록 build.sbt이 추가 :

    libraryDependencies += "com.lihaoyi" %% "upickle" % "0.4.3"
    
  13. ==============================

    13.나는 PLAY JSON 라이브러리를 사용 당신은 단지 JSON 라이브러리 여기 안 전체 프레임 워크에 대한 받는다는의 repo를 찾을 수 있습니다

    나는 PLAY JSON 라이브러리를 사용 당신은 단지 JSON 라이브러리 여기 안 전체 프레임 워크에 대한 받는다는의 repo를 찾을 수 있습니다

        val json = "com.typesafe.play" %% "play-json" % version
        val typesafe = "typesafe.com" at "http://repo.typesafe.com/typesafe/releases/"
    

    를 사용하는 방법에 대한 아주 좋은 자습서, 여기에 사용할 수 있습니다

    http://mandubian.com/2012/09/08/unveiling-play-2-dot-1-json-api-part1-jspath-reads-combinators/

    http://mandubian.com/2012/10/01/unveiling-play-2-dot-1-json-api-part2-writes-format-combinators/

    http://mandubian.com/2012/10/29/unveiling-play-2-dot-1-json-api-part3-json-transformers/

  14. ==============================

    14.나 또한 당신에게 JSON 버전의 아들을 들어 보겠습니다 :

    나 또한 당신에게 JSON 버전의 아들을 들어 보겠습니다 :

    import nl.typeset.sonofjson._
    
    arr(
      obj(id = 1, name = "John)
      obj(id = 2, name = "Dani)
    )
    
  15. ==============================

    15.독립적으로 재생 프레임 워크에서 JSON 처리하기위한 자사의 모듈을 출시 플레이, WS 플레이

    독립적으로 재생 프레임 워크에서 JSON 처리하기위한 자사의 모듈을 출시 플레이, WS 플레이

    그것에 대해 블로그 포스트 제작, http://pedrorijo.com/blog/scala-json/에서 확인해

    (이미 플레이 프레임 워크에 포함)의 경우 클래스 및 재생 WS 당신이 케이스를 사용하여 암시 간단한 한 줄에 JSON과 케이스 클래스 사이의 변환

    case class User(username: String, friends: Int, enemies: Int, isAlive: Boolean)
    
    object User {
      implicit val userJsonFormat = Json.format[User]
    }
    
  16. from https://stackoverflow.com/questions/8054018/what-json-library-to-use-in-scala by cc-by-sa and MIT license