【问题标题】:json4s extract error in scala with map valuesjson4s在具有映射值的scala中提取错误
【发布时间】:2017-04-28 08:03:01
【问题描述】:

我使用json4s native,带有这样的json字符串

val myjson = """
{
    "normative":"C",
    "prefixType":{
        "cod":["smallint", "int", "varchar(5)"],
        "des":["varchar", "string"],
        "fec":["timestamp"],
        "hms":["timestamp"],
        "tim":["timestamp"],
        "imp":["decimal","Float", "Double"]
        },
    "fixcolname":{
        "aud_usuario":"varchar(8)",
        "aud_fec":"timestamp",
        "aud_tim":"timestamp"
        },
    "symSep":"_", 
    "maxLength":26
}"""

还有一个案例类

case class colVerify(prefixType: Map[String, Array[String]], fixcolname: Map[String, String], symSep: String, maxLength: Int)

我想从json字符串中提取它

val t = parse(myjson)
implicit val formats = DefaultFormats
val myvfy = t.extract[colVerify]

然后出现这样的错误

Exception in thread "main" org.json4s.package$MappingException: Parsed JSON values do not match with class constructor
args=Map(des -> [Ljava.lang.String;@d7b1517, fec -> [Ljava.lang.String;@16c0663d, tim -> [Ljava.lang.String;@23223dd8, hms -> [Ljava.lang.String;@4ec6a292, imp -> [Ljava.lang.String;@1b40d5f0, cod -> [Ljava.lang.String;@ea4a92b),Map(aud_usuario -> varchar(8), aud_fec -> timestamp, aud_tim -> timestamp),_,26
arg types=scala.collection.immutable.HashMap$HashTrieMap,scala.collection.immutable.Map$Map3,java.lang.String,java.lang.Integer
constructor=public colVerify(scala.collection.mutable.Map,scala.collection.mutable.Map,java.lang.String,int)

好像是Map的类型有问题,但是如何隐式转换呢?

【问题讨论】:

    标签: json scala json4s


    【解决方案1】:

    问题是您的案例类中的地图是可变地图,这是故意的还是您不小心import collection.mutable.Map

    如果你真的想要可变映射,你可以实现一个自定义序列化器,如下所述:https://github.com/json4s/json4s#serializing-non-supported-types

    我的第一个想法是添加另一个带有不可变映射的构造函数,以防类似乎无法可靠地工作。

    【讨论】:

    • 我有import collection.mutable.Map,后来发现是json4s的问题,不支持scala的convert to mutable collection,最后放弃使用mutable in case class。而且效果很好。
    猜你喜欢
    • 2021-06-18
    • 2018-09-22
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多