Pergunta

i am working on Scala - i used JacksMapper it works fine, here goes the code

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)


  }

  }

But i am trying to use Lift_Json for scala. please give me some idea how to change the above code with Lift_Json tags i got Jar file of Lift_Json and worked on simple parse like compact(render(json)).

Foi útil?

Solução

Something like this should accomplish what you are looking to do. It will generate your test Map and then serialize that to a JSON String and write it out to a file. The next step will read it back in and extract it to a Map which you can read from - as in your above example.

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

While this is doable, I would highly recommend taking advantage of case classes and other Scala constructs to help with the serialization and de-serialization. Lift is really good at working with those object. Unless there is a reason for having everything untyped in a big Map, I think you'll save yourself a lot of headaches in the long run.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top