我需要为项目设置可配置的超时,该项目从 YAML 文件读取不同的配置。
我注意到Jackson 使用parsejava.time.Duration方法来反序列化持续时间字符串。问题在于它使用 ISO-8601 格式并期望持续时间具有格式。虽然遵循标准是个好主意,但要求人们提供超时并不是最好的选择,而是首选。PnDTnHnMn.nSPT10M10m
我确实为持续时间字段编写了一个自定义反序列化器,但奇怪的是杰克逊默认情况下无法处理这个问题。
10m反序列化人类友好以及使用Jackson ObjectMapper5s的最简单方法是什么?1hjava.time.Duration
Jackson运行java.time.Instant,默认情况下启用WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS(READ_以及).
杰克逊-数据类型- jsr310
它像这样生成JSON
{ "createDate":1421261297.356000000, "modifyDate":1421261297.356000000 }
在JavaScript中,从传统的millis时间戳(而不是像上面的秒/纳米)那样获得Date要容易得多,比如new Date(1421261297356).
我认为应该有一些理由默认采用纳米方法,那么这是什么原因呢?
现在正试图实例化一个新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 …
我有两个Map对象,将它们合并到Guava的Multimap中。合并后,我试图通过杰克逊序列化映射最终ObjectMapper用GuavaModule(否则它不序列正确)。但是,问题是,即使只有一个值,键的每个值也会作为列表的元素打印出来(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) 我使用 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 ×3
java ×2
duration ×1
guava ×1
java-8 ×1
java-time ×1
json ×1
kotlin ×1
milliseconds ×1
reflection ×1
scala ×1
scala-2.10 ×1
timestamp ×1
types ×1