0

私はScalaに取り組んでいます-私はJacksMapperを使用しました

import java.io.FileOutputStream
import java.io.ObjectOutputStream
import java.io.FileInputStream
import java.io.ObjectInputStream
import scala.util.Marshal
import java.io.ByteArrayOutputStream
import java.io.PrintWriter
import scala.util.parsing.json.JSONObject
import scala.util.parsing.json.JSON
import scala.util.parsing.json.JSONArray
import java.util.concurrent.atomic.AtomicReference
import scala.collection.mutable._
//import com.lambdaworks.jacks.JacksMapper
import java.io.BufferedReader
import java.io.FileReader
import net.liftweb.json._
import net.liftweb.json.JsonDSL._

import net.liftweb.json.JsonAST._
import net.liftweb.json.Extraction._
import net.liftweb.json.Printer._

//import com.codahale.jerkson.Json._

object jsonTest extends Serializable{

  def main(args: Array[String]): Unit = {

    var i = 1
    val map = new HashMap[String, Any]() with scala.collection.mutable.SynchronizedMap[String, Any]

    while(i < 10000)
    {

    var in_list = List[Any]()
    in_list :+= "dummy"
    in_list :+= "dummy"
    in_list :+= "dummy"

    val in_map = HashMap[String,Any]()
    in_map("dummy"+i) = in_list

    var out_list = List[Any]()
    out_list :+= "cat1" 
    out_list :+= "hash1"
    out_list :+= 100
    out_list :+= (System.currentTimeMillis()/1000).toInt
    out_list :+= in_map

    map("dummy"+i) = out_list
    i = i + 1
    }

    val json = JacksMapper.writeValueAsString[scala.collection.immutable.Map[String,Any]](map.toMap)



    Some(new PrintWriter("foo.txt")).foreach{p => p.write(json); p.close}
    val t1 = System.currentTimeMillis()

    val br : BufferedReader = new BufferedReader(new FileReader("foo.txt"));
    val sb:StringBuilder = new StringBuilder();
      var line = br.readLine();

       while (line != null) {
           sb.append    (line);
           sb.append("\n");
           line = br.readLine();
       }
       val content = sb.toString();
       br.close()

       println(content.length())

    val obj = JacksMapper.readValue[scala.collection.immutable.Map[String,Any]](content)
       val obj = scala.collection.immutable.Map[String,Any]
    println(obj("dummy3"))
    println(System.currentTimeMillis() - t1)


  }

  }

しかし、私はスカラに Lift_Json を使用しようとしています。上記のコードを Lift_Json タグで変更する方法を教えてください。Lift_Json の Jar ファイルを取得し、compact(render(json)) のような単純な解析に取り組みました。

4

1 に答える 1

2

このようなものは、あなたが探していることを達成するはずです。テストを生成し、それを文字列Mapにシリアル化しJSON、ファイルに書き込みます。次のステップでは、それを読み込んで、上記の例のように、読み取ることができるマップに抽出します。

import net.liftweb.json._
import java.io._

implicit val formats = net.liftweb.json.DefaultFormats

val map = {
  val mb = new scala.collection.mutable.HashMap[String, Any]()
  (1 to 10000).foreach { i =>
    val in_list = "dummy" :: "dummy" :: "dummy" :: Nil
    val in_map = Map("dummy%s".format(i) -> in_list)
    mb += "dummy%s".format(i) -> List("cat1", "hash1", 100, (System.currentTimeMillis()/1000).toInt, in_map) 
  }
  mb.toMap
}

val json = Extraction.decompose(map)

val jsonStrOut = Printer.pretty(JsonAST.render(json))
val fileName = "foo.txt"

val fw = new FileWriter(fileName)
fw.write(jsonStrOut)
fw.close()

val jsonStrIn = scala.io.Source.fromFile(fileName).mkString

val obj = parse(jsonStrIn).asInstanceOf[JObject].values
println(obj("dummy3"))

case classesこれは実行可能ですが、シリアライゼーションとデシリアライゼーションに役立つその他の Scala コンストラクトを利用することを強くお勧めします。Lift は、これらのオブジェクトの操作に非常に優れています。大きなマップですべてのタイプを指定しない理由がない限り、長い目で見れば多くの頭痛の種から解放されると思います。

于 2013-07-10T14:26:14.217 に答える