com.fasterxml.jackson.databind.JsonMappingException

时间:2016-11-30 08:46:54

标签: scala jackson

我使用JacksMapper将JSON字符串解析为Map[String,String]

  def parseJSON(line: String): Map[String, String] = {
    JacksMapper.readValue[Map[String, String]](line)
  }

对于某些JSON字符串,它会抛出错误:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token

特别是它出现在这个字符串中:

{" ID":" 123""名称":"访问""类别":& #34; ABC"" x_ids":[" 220"]}

我认为问题出在"x_ids":["220"],而我希望结果为Map[String,String]。所以,在这种情况下,我有兴趣将数组转换为像"x_ids"->"220,230"这样的字符串。如何灵活地进行,以便解决方案适用于某些情况下可能是阵列的其他可能字段?

修改 在我的情况下,我从来没有复杂的数组应该用静态类解析。只有数字或字符串数​​组。

2 个答案:

答案 0 :(得分:1)

你可以分两步完成:

  1. 解析JSON而不关心值类型
  2. 映射值并根据需要进行转换
  3. 这可能会产生类似的结果:

    def parseJSON(line: String): Map[String, String] = {
      JacksMapper.readValue[Map[String, Any]](line)
        .mapValues {
          case array: Iterable[Any] => array.mkString(", ")
          case anyValue: Any        => anyValue.toString
        }
    }
    

答案 1 :(得分:0)

这是因为您声称所有值都是System.Threading.Thread.CurrentThread.CurrentCulture s,但String是JSON数组,而不是JSON字符串。两种方法:

  1. 将值类型声明为x_ids,在这种情况下,您会获得java.lang.ObjectString s
  2. 启用List在这种情况下,带有一个(且只有一个!)元素的JSON数组可以“展开”以匹配预期类型 - 不是100%确定它在这里工作,但理论上应该