【问题标题】:Working with Lift-JSON in Scala convert map to string在 Scala 中使用 Lift-JSON 将映射转换为字符串
【发布时间】:2013-07-10 10:35:48
【问题描述】:

我正在研究 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 用于 scala。 请给我一些想法如何使用 Lift_Json 标签更改上述代码 我得到了 Lift_Json 的 Jar 文件并进行了简单的解析,比如 compact(render(json))。

【问题讨论】:

    标签: json scala lift lift-json


    【解决方案1】:

    这样的事情应该可以完成您想要做的事情。它将生成您的测试Map,然后将其序列化为JSON 字符串并将其写入文件。下一步将读回它并将其提取到您可以从中读取的 Map 中 - 如上面的示例所示。

    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 非常擅长处理这些对象。除非有理由在大 Map 中不输入所有内容,否则从长远来看,我认为您会省去很多麻烦。

    【讨论】:

    • 线程“main”中的异常 java.lang.NoClassDefFoundError: com/thoughtworks/paranamer/ParameterNamesNotFoundException at net.liftweb.json.Extraction$.decompose(Extraction.scala:81) at JsonLift$.main (JsonLift.scala:20) 在 JsonLift.main(JsonLift.scala)
    • 引起:java.lang.ClassNotFoundException: com.thoughtworks.paranamer.ParameterNamesNotFoundException at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run( URLClassLoader.java:355) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:354) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:423) 在 sun .misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) ... 3 更多
    • 似乎,您的类路径中缺少 paranamer jar。 groups.google.com/forum/#!msg/liftweb/dpJE5g7cuF8/XCQzEJcOkYoJ
    猜你喜欢
    • 2015-07-06
    • 2015-04-30
    • 2019-08-12
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多