SORU
29 Mayıs 2009, Cuma


Nasıl ve Scala içinde bir JSON dize yapısı ayrıştırılamadı / kaldırabilir miyim

JSON tarayıcı ve benim uygulama arasında veri göndermeye çalışıyorum.

Asansör 1.0 ve JSON dize oluşturmak ayrıştırmak için kullanmaya çalışıyorum, ama nedense JSON sadece inşa ayrıştırılamadı duyuyorum:

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

Nasıl da tekrar ayrıştırılabilir Scala/Lift geçerli bir JSON mesaj programlı olarak inşa miyim?

CEVAP
29 Mayıs 2009, Cuma


Tek tırnaklı dizeleri ile JSON üreten 1.0 JsCmd, Asansör kullanmak, çift tırnaklı dizeleri destekleyen scala'nın ayrıştırıcı, bunu ayrıştırmak için çalışıyorsunuz.

Önemli JSON için birden fazla tanımları vardır gerçekleştirmektir.

Tek tırnaklı dize geçerli bir JSON?

  • 21 ** göre
  • Orijinal RFC 4627 Crockford göre değil

Asansör ve Scala sürümleri arasında JSON, bazen farklı davranış ile ayrıştırmak için birçok yol sağlar.

Dizeleri bu ayrıştırıcıları tarafından kabul edilen eşdeğer değildir.

Burada Ürün için çeşitli yöntemler ve ayrıştırma JSON dizeleri bazı açıklamalar ve örnekler.


lift-json kütüphane DSL ile JSON üreten

  • Tavsiye
  • İsmine rağmen, bu Asansör geri kalanı üzerinde hiçbir bağımlılıkları ile ayrı bir proje

örnek:

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 kütüphanesi ile JSON ayrıştırma

  • Tavsiye
  • Dava sınıflar km/örtülü eşleme sağlar
  • Dava sınıflar içinde tanımlanan konsol şu anda desteklenmiyor (com.thoughtworks.paranamer.ParameterNamesNotFoundException: Unable to get class bytes atar)
  • Aşağıdaki örnek, scala konsolda çalışması PublicID, önceden varolan bir durum scala sınıf kullanır.

örnek:

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 ve 2.8.1 ayrıştırma JSON

  • - "No longer really supported" . Tavsiye
  • 2.7.7. ayrıştırıcı tek tırnaklı JSON ayrıştırmak olmaz Scala
  • Bu ayrıştırma yöntemi, Soru içinde kullanılır

örnek:

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

Asansör 2.0 JSON ayrıştırma ve util.JSONParser 2.2

  • Nötr Öneri
  • Asansör açıklama.JSONParser tek veya çift tırnaklı JSON dizeleri ayrıştırma

örnek:

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))

Asansör 2.0 JSON ayrıştırma ve json.JsonParser ile 2.2

  • Nötr Öneri
  • Asansör json.JsonParser tek tırnaklı JSON dizesini ayrıştırmak değil

örnek:

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...

Asansör 1.0 JsCmd ile JSON üreten

  • Tavsiye - çıkış tüm JSON ayrıştırıcıları için geçerli değil
  • -Alıntılar tek dizeler: etrafında dikkat edin

örnek:

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

Asansör 2.0 JsCmd ile JSON üreten

  • Nötr Öneri
  • Çift tırnak dizeleri etrafında not:

örnek:

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

Scala içinde JSON (2.10 test) Producint

örnek:

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Art Food Kitty - Kelly Eddington

    Art Food Kit

    7 Kasım 2006
  • Damien Walters

    Damien Walte

    20 AĞUSTOS 2006
  • Eric Magidson

    Eric Magidso

    4 Ocak 2009