如何转换Scala的列表[org.bson.Document]对JSON字符串?

问题描述 投票:0回答:2

我曾在AWS LAMBDA的函数:

def test(pj: Pojo, context: Context): java.util.List[Document]

这是不进行初始化与输入的JSON值在所有pj

我发现在斯卡拉做AWS LAMBDA这样的another way

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule

val scalaMapper = new ObjectMapper().registerModule(new DefaultScalaModule)

def test(input: InputStream, output: OutputStream): Unit = {
  val inputPojo = scalaMapper.readValue(input, classOf[Pojo])
  val answer: Seq[Document] = getTheRealAnswer(inputPojo)
  val jsonStr = "{ frustration: \"I wish my answer was JSON.\" }"
  output.write(jsonStr.getBytes("UTF-8"))
}

而这样的作品,除了我真想回到作为一个答案是文档的JSON数组。我应该如何着手呢?

编辑:在我原来的帖子,我写道:“[第一例]被返回答案错误22.基本上AWS处理列表[文件]作为文件名的JSON转换(我认为),JSON有很多冒号和错误22没有被允许。奇怪的文件名冒号来了“。这竟然是我从AWS CLI的AWS lambda函数的调用错误。我省略在命令调用输出文件名,并返回JSON用AWS CLI解释为一个文件名。

json scala aws-lambda fasterxml
2个回答
1
投票

自从我写了这个消息,我有这样的事情的工作:

def jsonizeDocs(cDocument: Seq[Document]): String = {
  val sb=new StringBuilder
  for (doc <- cDocument) {
    if (sb.nonEmpty) {
      sb.append(",")
    }
    sb.append(doc.toJson)
  }
  sb.toString
}

1
投票

注意!这个答案是基于光包装我身边json4s写的,我称之为JSON Extensions

假设你正在使用Scala的对象,导入io.onema.json.Extensions._

import io.onema.json.Extensions._

case class Doc(title: String, content: String)

val listOfDocs = Seq(Doc("Foo", "bar"), Doc("Bar", "Baz"), Doc("Blah", "Bax"))
val json: String = listOfDocs.asJson
println(json)  
// [{"title":"Foo","content":"bar"},{"title":"Bar","content":"Baz"},{"title":"Blah","content":"Bax"}]

running example here

现在,因为你正在使用一个POJO,你需要导入io.onema.json.JavaExtensions._。假设你有以下POJO:

public class Document {
 private String title;
 private String content;
 public String getTitle() {return title;}
 public String getContent() {return content;}
 public void setTitle(String title) { this.title = title;}
 public void setContent(String content) {this.content = content;}
}

在Scala代码像这样使用此方法:

import io.onema.json.JavaExtensions._
import com.example.Document

// ...

def jsonizeDocs(cDocument: Seq[Document]): String = {
  val json: String = cDocument.asJson
  println(json)
  json
}

在AWS拉姆达(和周围走另一条路)使用jsonDecode和自定义对象映射到反序列化到预期的类型:

import io.onema.json.JavaExtensions._
import io.onema.json.Mapper
import com.example.Document

val jsonString = """[{"title":"Foo","content":"bar"},{"title":"Bar","content":"Baz"},{"title":"Blah","content":"Bax"}]"""
val mapper: ObjectMapper = Mapper.allowUnknownPropertiesMapper
val doc: Document = jsonString.jsonDecode[Document](mapper)

我用在这里拉姆达框架,能够反序列化AWS拉姆达事件以及自定义类型,看到simple example here相当成功所描述的方法。

而已!你可以使用这个库或Java或Scala中的许多JSON序列化的一个。如果你知道你的对象的类型,大多数图书馆将使您序列化JSON和背部很容易。

© www.soinside.com 2019 - 2024. All rights reserved.