标签: jackson-modules

在 Java 中反序列化人类可读持续时间的最简单方法是什么?

我需要为项目设置可配置的超时,该项目从 YAML 文件读取不同的配置。

我注意到Jackson 使用parsejava.time.Duration方法来反序列化持续时间字符串。问题在于它使用 ISO-8601 格式并期望持续时间具有格式。虽然遵循标准是个好主意,但要求人们提供超时并不是最好的选择,而是首选。PnDTnHnMn.nSPT10M10m

我确实为持续时间字段编写了一个自定义反序列化器,但奇怪的是杰克逊默认情况下无法处理这个问题。

10m反序列化人类友好以及使用Jackson ObjectMapper5s的最简单方法是什么?1hjava.time.Duration

java duration jackson deserialization jackson-modules

3
推荐指数
1
解决办法
1862
查看次数

Jackson Java 8 DateTime序列化

Jackson运行java.time.Instant,默认情况下启用WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS(READ_以及). 杰克逊-数据类型- jsr310

它像这样生成JSON

{ "createDate":1421261297.356000000, "modifyDate":1421261297.356000000 }

在JavaScript中,从传统的millis时间戳(而不是像上面的秒/纳米)那样获得Date要容易得多,比如new Date(1421261297356).

我认为应该有一些理由默认采用纳米方法,那么这是什么原因呢?

timestamp milliseconds java-8 jackson-modules java-time

2
推荐指数
2
解决办法
7845
查看次数

Scala类[_ $ 1],其中类型_ $ 1

现在正试图实例化一个新JSONConverter的注册Jackson的Scala模块.

  private def getConverter(implicit m: ClassTag[T]) = {
    new JSONConverter[T](classTag[T].runtimeClass, bucketName)
    JSONConverter.registerJacksonModule(DefaultScalaModule)
    converter
  }
Run Code Online (Sandbox Code Playgroud)

上面的代码位于标准的Scala特征中trait Writeable[T] { }.

上面代码的问题是Scala似乎在使用Types时遇到困难.编译器错误是:

[error]  found   : Class[_$1] where type _$1
[error]  required: Class[T]
[error]         val converter = new JSONConverter[T](classTag[T].runtimeClass, bucketName(clientId))
[error]                                                          ^
[error] one error found
Run Code Online (Sandbox Code Playgroud)

有谁知道这个问题的来源或容易解决?谢谢!

更新

虽然@wingedsubmariner有一个答案允许这个最初编译,但是一旦我去编写更多代码,问题就会进一步发展.我将展示一个例子:

val o = bucketLookup(clientId).fetch(id, classTag[T].runtimeClass).withConverter(converter).withRetrier(DB.retrier).r(DB.N_READ).execute()
Run Code Online (Sandbox Code Playgroud)

withConverter编译器抛出相同的错误:

[error]  found   : com.basho.riak.client.convert.JSONConverter[T]
[error]  required: com.basho.riak.client.convert.Converter[_$1] where type _$1
[error]     val o = bucketLookup(clientId).fetch(id, classTag[T].runtimeClass).withConverter(converter).withRetrier(DB.retrier).r(DB.N_READ).execute()
Run Code Online (Sandbox Code Playgroud)

我甚至尝试使用相同的类型转换,converter.asInstanceOf[JSONConverter[T]]但继承(JSONConverter<T> extends …

reflection types scala scala-2.10 jackson-modules

1
推荐指数
1
解决办法
791
查看次数

Jackson ObjectMapper用方括号包装每个元素(甚至是单个值)

我有两个Map对象,将它们合并到Guava的Multimap中。合并后,我试图通过杰克逊序列化映射最终ObjectMapperGuavaModule(否则它不序列正确)。但是,问题是,即使只有一个值,键的每个值也会作为列表的元素打印出来(objectmapper用方括号将每个值包装起来)。我得到的基本输出如下

{
    "address": {
        "city": ["san francisco"]
    },
    "company": {
        "employees": [
            [{
                "name": "David",
                "lastname": "Foobar",
                "age": 22
            }, {
                "name": "Michael",
                "lastname": "FizBuzz",
                "age": 35
            }]
        ]
    },
    "config": {
        "key1": ["value1", "value3"],
        "key2": ["value2"],
        "key4": ["value4"]
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,“地址”->“城市”->“旧金山”用方括号company -> employees包裹,也用两次包裹。此外,我已经尝试过SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED, trueFuture,但没有任何改变。

    Person person = new Person();
    person.setName("David");
    person.setLastname("Foobar");
    person.setAge(22);

    Person person2 = new Person();
    person2.setName("Michael");
    person2.setLastname("FizBuzz");
    person2.setAge(35);

    Map<String, Map<String, Object>> map1 = new ImmutableMap.Builder<String, Map<String, Object>>()
            .put("config", ImmutableMap.of( …
Run Code Online (Sandbox Code Playgroud)

java json jackson guava jackson-modules

1
推荐指数
1
解决办法
1970
查看次数

kotlin:无法使用 Jackson 将字符串解析为枚举

我使用 lib jackson-module-kotlin 将 json 字符串解析为对象。

我的问题是,当我将字符串解析为 enum 时,当我使用 intellij 启动时,我有以下堆栈跟踪:

引起原因:kotlin.reflect.jvm.internal.KotlinReflectionInternalError:尚未完全支持内置 Kotlin 类型的反射。未找到公共最终 val 名称的元数据:kotlin.Enum[DeserializedPropertyDescriptor@212b316a] 中定义的 kotlin.String

我用maven启动的时候没有这个问题。

我使用 kotlin 1.1.51,使用 intellij kotlin 插件 1.2.0-release-IJ2017.3-1,我的目标是 JVM 1.8,我使用 jackson-module-kotlin 版本 2.8.7

我应该怎么办?

 enum class CType { DEAL, FILE }
 data class Code(val code: String, val type: CType)

 fun testDeserialization() {
    val mapper = jacksonObjectMapper()
    // following line throws an exception:
    mapper.readValue("""{"code":"A","type":"DEAL"}""", Code::class.java)
 }
Run Code Online (Sandbox Code Playgroud)

jackson kotlin jackson-modules

0
推荐指数
1
解决办法
5046
查看次数