首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用变量键转换Json

用变量键转换Json
EN

Stack Overflow用户
提问于 2018-02-25 19:15:57
回答 3查看 860关注 0票数 3

我得到了一个JSON

代码语言:javascript
复制
 {
    "segment": {
        "134": "34",
        "154": "342"
    }
}

我所要做的就是将键映射为值,即将其转换为格式,如

代码语言:javascript
复制
    {
    "segment ": [{
        "segmentationStrategyId ": 134,
        "segmentID ": 34
    }, {
        "segmentationStrategyId ": 154,
        "segmentID ": 342
    }]
}

尝试使用json4s解析器,但关键是差异,我不能将它映射到case类。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-26 02:23:29

您可以使用spary.json来转换json。如果您使用SBT,则可以在您的项目中使用

代码语言:javascript
复制
libraryDependencies += "io.spray" %%  "spray-json" % "1.3.3"

为输入和输出定义case class

代码语言:javascript
复制
case class InputJson(segment: Map[String, String])
case class OutputSegment(segmentationStrategyId: Int, segmentId: Int)
case class OutputJson(segment: List[OutputSegment])

通过将case类转换为json并将json转换为case类来定义协议。

代码语言:javascript
复制
import spray.json._
object MyProtocol extends DefaultJsonProtocol {
  implicit val inputJsonFormat = jsonFormat1(InputJson.apply)
  implicit val outputSegmentFormat = jsonFormat2(OutputSegment.apply)
  implicit val outputJsonFormat = jsonFormat1(OutputJson.apply)
}

投入json:

代码语言:javascript
复制
val jsonString: String =
    """{
      |    "segment": {
      |        "134": "34",
      |        "154": "342"
      |    }
      |}""".stripMargin

将json String解析为JsValue

代码语言:javascript
复制
val jsonVal: JsValue = jsonString.parseJson

JsValue转换为Case Class

代码语言:javascript
复制
val jsonInput: InputJson = jsonVal.convertTo[InputJson]

现在,您可以将Map[String,String]段映射为OutputSegment格式。

代码语言:javascript
复制
val outputSegments: List[OutputSegment] = jsonInput.segment.flatMap {
    case (key, value) => Try(OutputSegment(key.toInt, value.toInt)).toOption
  }.toList

创建OutputJson并获取等效的Json字符串。

代码语言:javascript
复制
val outputJson: String = OutputJson(outputSegments).toJson.prettyPrint

输出Json字符串:

代码语言:javascript
复制
{
  "segment": [{
    "segmentationStrategyId": 134,
    "segmentId": 34
  }, {
    "segmentationStrategyId": 154,
    "segmentId": 342
  }]
}

最后的完整代码示例:

代码语言:javascript
复制
import spray.json._
import scala.util.Try

object Test
  extends App {

  // case class
  case class InputJson(segment: Map[String, String])
  case class OutputSegment(segmentationStrategyId: Int, segmentId: Int)
  case class OutputJson(segment: List[OutputSegment])

  // protocol for json conversion
  object MyProtocol extends DefaultJsonProtocol {
    implicit val inputJsonFormat = jsonFormat1(InputJson.apply)
    implicit val outputSegmentFormat = jsonFormat2(OutputSegment.apply)
    implicit val outputJsonFormat = jsonFormat1(OutputJson.apply)
  }

  // input json
  val jsonString: String =
    """{
      |    "segment": {
      |        "134": "34",
      |        "154": "342"
      |    }
      |}""".stripMargin

  import MyProtocol._

  val jsonVal: JsValue = jsonString.parseJson

  val jsonInput: InputJson = jsonVal.convertTo[InputJson]

  val outputSegments: List[OutputSegment] = jsonInput.segment.flatMap {
    case (key, value) => Try(OutputSegment(key.toInt, value.toInt)).toOption
  }.toList

  val outputJson: String = OutputJson(outputSegments).toJson.prettyPrint

  println(outputJson)
}

参考链接:https://github.com/spray/spray-json

票数 4
EN

Stack Overflow用户

发布于 2018-02-25 20:30:32

我不熟悉json4s,但我很快就把它写出来了,也许会有所帮助:

代码语言:javascript
复制
import org.json4s._
import org.json4s.native.JsonMethods._

case class Segment(segmentationStrategyId: Int, segmentId: Int)

object Test {
  implicit val formats: DefaultFormats.type = DefaultFormats
  val json: String =
    """
      | {
      |    "segment": {
      |        "134": "34",
      |        "154": "342"
      |    }
      |}
    """.stripMargin

  def main(args: Array[String]): Unit = {
    val originalSegments = for {
      JObject(o) <- parse(json)
      JField("segment", JObject(segment))  <- o
    } yield segment

    val originalSegment = originalSegments.head
    val newSegments = originalSegment.map(
      s => Segment(s._1.toInt, s._2.extract[String].toInt)
    )
    println(newSegments)
  }
}

印出

代码语言:javascript
复制
List(Segment(134,34), Segment(154,342))

因此,您现在有了一个案例类列表,您应该能够将这些类转换成JSON

票数 2
EN

Stack Overflow用户

发布于 2018-02-26 16:09:41

使用jsoniter-scala更容易和更快。

添加库依赖项:

代码语言:javascript
复制
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
)

定义输入和输出JSON的数据结构:

代码语言:javascript
复制
case class Input(segment: mutable.LinkedHashMap[Int, Int])
case class OutputSegment(segmentationStrategyId: Int, segmentID: Int)
case class Output(segment: List[OutputSegment])

为根案例类生成编解码器:

代码语言:javascript
复制
import com.github.plokhotnyuk.jsoniter_scala.macros._
import com.github.plokhotnyuk.jsoniter_scala.core._
implicit val inCodec: JsonValueCodec[Input] = JsonCodecMaker.make[Input](CodecMakerConfig())
implicit val outCodec: JsonValueCodec[Output] = JsonCodecMaker.make[Output](CodecMakerConfig())

读取输入,转换为输出并序列化:

代码语言:javascript
复制
val fis = new FileInputStream("/tmp/input.json")
val input = try readFromStream(fis) finally fis.close()
val output = Output(input.segment.map(kv => OutputSegment(kv._1, kv._2)))
val fos = new FileOutputStream("/tmp/output.json")
try writeToStream(output, fos) finally fos.close()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48977397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档