您好,我正在尝试读取 JSON 文件并使用模板按特定顺序排序,我可以得到一些有关如何执行此操作的指示吗?



我找到了如何从中读取,但是,似乎找不到我需要的有关如何使用自己的模板对其进行排序的信息。 并将其写入不同的 JSON 文件。我正在使用Scala。

通常,要将数据从一个JSON文件转换为另一个JSON文件,您需要将其解析为内存中的一些数据结构(案例类,Scala集合等),转换它们并序列化回文件。

Circe是效率最低的JSON解析器,特别是当它需要解析文件时。它的核心解析器仅适用于需要将整个文件读取到 RAM 并将其从编码字节(通常是 UTF-8)转换为字符串的字符串,甚至它的替代 Jawn 解析器将整个文件读取为字节数组,然后将其转换为字符串,然后开始解析。它的格式化程序也有很多开销:在开始将其写入文件之前,将整个输出序列化为字符串或字节缓冲区。

更好的是使用 circe-jackson 集成,甚至更好的是使用 jackson-module-scala:两者都支持从 FileInputStream 读取和写入 FileOutputStream。

最高效的 Scala 解析器和序列化器可用于缓冲读取/写入文件,下面是使用它解析-转换-序列化代码的示例。

让我们有以下 JSON 文件的内容:

{
"name": "John",
"devices": [
{
"id": 1,
"model": "HTC One X"
}
]
}

我们将它转换为:

{
"name": "John",
"devices": [
{
"id": 1,
"model": "HTC One X"
},
{
"id": 2,
"model": "iPhone X"
}
]
}

以下是我们如何用jsoniter-scala做到这一点:

libraryDependencies ++= Seq(
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "0.29.2" % Compile, 
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "0.29.2" % Provided // required only in compile-time
)
// import required packages
import java.io._
import com.github.plokhotnyuk.jsoniter_scala.macros._
import com.github.plokhotnyuk.jsoniter_scala.core._
// define your model that mimic JSON format
case class Device(id: Int, model: String)
case class User(name: String, devices: Seq[Device])
// create codec for type that corresponds to root of JSON
implicit val codec = JsonCodecMaker.make[User](CodecMakerConfig())
// read & parse JSON from file to your data structures
val user = {
val fis = new FileInputStream("/tmp/input.json")
try readFromStream(fis)
finally fis.close()
}
// transform your data
val newUser = user
.copy(devices = user.devices :+ Device(id = 2, model = "iPhone X"))
// write your transformed data to json file
val fos = new FileOutputStream("/tmp/output.json")
try writeToStream(newUser, fos)
finally fos.close()

你的问题非常抽象,但这里有一个很好的库,用于在 Scala 中进行 JSON 解析和操作

https://github.com/circe/circe

最新更新