gpt4 book ai didi

java - 为什么当 String.valueOf() 进行强制转换时 toString 不起作用

转载 作者:行者123 更新时间:2023-12-02 01:33:37 25 4
gpt4 key购买 nike

我需要将 Json 解析为 Map[String,String] 结构。 Json 可能包含数字和字符串类型作为值。

因此,为了将其存储为字符串,我应用了 toString 方法,它抛出 ClassCastException。但是,如果应用 String.valueOf() ,则一切正常。

  1. 为什么会这样?
  2. 是否有更好的方法来进行此类转换?
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule

import scala.collection.Map
import scala.util.parsing.json.JSON

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


val str = "[ { \"name\": \"VehicleType\", \"value\": 11 }, { \"name\": \"VehicleWeight\", \"value\": \"12000\" } ]"
val customfields = JSON.parseFull(str) match {
case Some(map: List[Map[String, String]]) =>
// map.map(map => {map("name") -> map("value").toString}).toMap

// that throws:
// java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
// at #worksheet#.$anonfun$customfields$1.apply(scratch.scala2:14)
// at #worksheet#.$anonfun$customfields$1.apply(scratch.scala2:14)
// at scala.collection.immutable.List.map(scratch.scala2:269)
// at #worksheet#.customfields$lzycompute(scratch.scala2:14)

// that works fine
map.map(map => {map("name") -> String.valueOf(map("value"))}).toMap
case _ => Map.empty[String, String]
}

最佳答案

因为模式匹配与 List 类型匹配,但不会一直匹配映射内的所有类型,因此需要输入 Some 子句。

所以,而不是 case Some(map: List[Map[String, String]]) =>

尝试这样做:

case Some(map: List[Map[String, _]]) =>
map.map(map => {map("name") ->
map("value") match {
case s: String => s
case i: java.lang.Number => i
case unexpectedType => throw Exception(s"Unexpected type $unexpectedType")
}.toString}).toMap

这就是您如何安全地处理 map 中的每个值的方法。

关于java - 为什么当 String.valueOf() 进行强制转换时 toString 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55603954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com