在Scala中将映射转换为字符串中使用Lift JSON
我正在使用Scala-我使用了JacksMapper它工作得很好, 代码在这里在Scala中将映射转换为字符串中使用Lift JSON,json,scala,lift,lift-json,Json,Scala,Lift,Lift Json,我正在使用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.Pr
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)
}
}
import java.io.FileOutputStream
导入java.io.ObjectOutputStream
导入java.io.FileInputStream
导入java.io.ObjectInputStream
导入scala.util.Marshal
导入java.io.ByteArrayOutputStream
导入java.io.PrintWriter
导入scala.util.parsing.json.JSONObject
导入scala.util.parsing.json.json
导入scala.util.parsing.json.JSONArray
导入java.util.concurrent.AtomicReference
导入scala.collection.mutable_
//导入com.lambdaworks.jacks.JacksMapper
导入java.io.BufferedReader
导入java.io.FileReader
导入net.liftweb.json_
导入net.liftweb.json.JsonDSL_
导入net.liftweb.json.JsonAST_
导入net.liftweb.json.Extraction_
导入net.liftweb.json.Printer_
//导入com.codahale.jerkson.Json_
对象jsonTest扩展了可序列化{
def main(参数:数组[字符串]):单位={
变量i=1
val map=scala.collection.mutable.SynchronizedMap[String,Any]的新HashMap[String,Any]()
而(i<10000)
{
清单中的变量=清单[任何]()
列表中:+=“虚拟”
列表中:+=“虚拟”
列表中:+=“虚拟”
val in_map=HashMap[String,Any]()
in_映射(“虚拟”+i)=in_列表
var out_list=list[Any]()
输出列表:+=“cat1”
输出列表:+=“哈希1”
输出列表:+=100
输出列表:+=(System.currentTimeMillis()/1000).toInt
out_列表:+=in_映射
映射(“虚拟”+i)=输出列表
i=i+1
}
val json=JacksMapper.writeValueAsString[scala.collection.immutable.Map[String,Any]](Map.toMap)
一些(新的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=新的StringBuilder();
var line=br.readLine();
while(行!=null){
某人追加(行);
某人附加(“\n”);
line=br.readLine();
}
val content=sb.toString();
br.close()
println(content.length())
val obj=JacksMapper.readValue[scala.collection.immutable.Map[String,Any]](内容)
val obj=scala.collection.immutable.Map[字符串,任意]
println(obj(“dummy3”))
println(System.currentTimeMillis()-t1)
}
}
但我正在尝试为scala使用Lift_Json。
请告诉我如何使用Lift_Json标记更改上述代码
我得到了Lift_Json的Jar文件,并进行了类似compact(render(Json))的简单解析。这样的东西应该可以完成您想要做的事情。它将生成您的测试
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类
和其他Scala构造来帮助序列化和反序列化。Lift非常擅长处理这些物体。除非有理由在一个大地图中取消所有内容的类型化,否则从长远来看,我认为您将为自己省去很多麻烦。线程“main”java.lang.NoClassDefFoundError中的异常:com/thoughtworks/paranamer/ParameterNamesNotFoundException位于net.liftweb.json.Extraction$.decompose(Extraction.scala:81)位于JsonLift$.main(JsonLift.scala:20)在JsonLift.main(JsonLift.scala)由以下原因引起:java.lang.ClassNotFoundException:com.thoughtworks.paranamer.ParameterNamesNotFoundException位于java.net.URLClassLoader$1.run(URLClassLoader.java:366)位于java.net.URLClassLoader$1.run(URLClassLoader.java:355)位于java.security.AccessController.doPrivileged(本机方法)在java.net.URLClassLoader.findClass(URLClassLoader.java:354)在java.lang.ClassLoader.loadClass(ClassLoader.java:423)在sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)在java.lang.ClassLoader.loadClass(ClassLoader.java:356)在java.net.net.net.URLClassLoader.findclassloader.findClass(urlcoader.java:354)在java:354)在sun.lang。