我使用Kotlin和Jongo来访问MongoDB。 Jongo使用Jackson来序列化/反序列化对象,以便从MongoDB保存和读取它们。 我使用Jackson-Kotlin模块来帮助使用构造函数序列化Kotlin数据类。 下面是一个序列化好的数据类的例子: data class Workflow ( @field:[MongoId MongoObjectId] @param:MongoId var id: String? = null, val name: String, val states: Map ) 下面是一个不能反序列化的类的例子: data class Session ( @field:[MongoObjectId MongoId] @param:MongoId var id: String? = null, var status: CallStatus, var currentState: String, var context: MutableMap, val events: MutableMap ) Jongo抛出了以下例外,因为Jackson的反序列化失败了: org.jongo.marshall.MarshallingException: Unable to unmarshall result […]
不确定如何最好地解释这个问题,所以我讽刺了java和kotlin相同的代码来更好的演示。 当我读取JSON时,即使参数甚至不是json的一部分,数据bean默认值是缺少字段的值,但它似乎强制数据bean值为NULL。 在Java中它正常工作,从来没有试图取消从未提供开始的值。 在Kotlin,它似乎打破了,因为它试图取消一个不可空的字段。 在Kotlin data class Pojo(val name: String, val age: Int, val list: List = emptyList(), val ts: Date = Date()) private val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule()) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) fun main(args: Array) { mapper.readValue(“””{“name”: “John Doe”, “list”: [“yellow”, “green”], “age”: 42}”””, Pojo::class.java) } 哪个抛出exception java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Pojo., parameter […]
几年后,我重新回到了后端开发。 我选择了Kotlin的Spring Boot。 我想有一个以域为中心的,一般的,可重用的模型对象。 对于服务调用,我希望返回特定于用例的响应,其中,有效负载进出只是特定场景的信息。 (我们可以称之为“合同优先”或“不要泄露你的胆量”) 在过去,我可能已经通过使用像Dozer这样的框架将来自可重用模型对象的信息映射到可序列化的值对象上来实现服务。 或者,我正在考虑为给定的端点注册一个自定义序列化器,例如Django Rest Framework。 (不知道这是如何工作jackson序列化通过注释)。 问题: 有没有一种简单的方法来使用jackson自定义序列化器来做我想要的? 还是继续使用我多年前使用的价值对象方法会更好?
我试图创建一个2服务的资源,1在application / x-www-form-urlencoded和字符串有效载荷和其他应用程序/ json格式与json正文。 我有这个代码: @POST @Path(“/test”) fun test(@Context request: ContainerRequest): Response { val baos = ByteArrayOutputStream() request.entityStream.use { it.copyTo(baos) } val ipnRawData = baos.toString() var map : Map map = when (request.headers.getFirst(“Content-Type”)) { “application/json” -> objectMapper.convertValue(ipnRawData,Map::class.java) as Map “application/x-www-form-urlencoded” -> LinkedHashMap() else -> throw UnsupportedOperationException() } //….handle the map return Response.status(200).build() } 但是,当我尝试运行它与json选项,和身体: {“name” […]
使用Jackson可以反序列化为一个具有私有字段和自定义参数构造函数的类,而不使用注释,也不需要修改类。 我知道在使用这个组合的时候Jackson是可能的:1)Java 8,2)用“-parameters”选项编译; 3)参数名称与JSON匹配。 但是GSON默认也是可以的,没有这些限制。 例如: public class Person { private final String firstName; private final String lastName; private final int age; public Person(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } public static void main(String[] args) throws IOException { String json = “{firstName: \”Foo\”, lastName: \”Bar\”, […]
我一直在玩服务器端Kotlin,Spring MVC和Jackson。 我使用http://start.spring.io/构建了一个简单的应用程序,但是我可能在JsonView注释中犯了一个错误。 这个: @RestController class MyRestController { @RequestMapping(“/user”) @JsonView(User::class) fun getUser() : User = User(“Fred”,50) } data class User(val name: String, val age: Int) …当被curl调用时 ph@sleek ~ $ curl -X GET http://localhost:8080/user; echo {} ph@sleek ~ $ …当我预计{“name”:”Fred”,”age”:50}时,结果是{} {“name”:”Fred”,”age”:50} 。 有什么我做错了吗?
我有一个基本的用户类,其中包括一个用户名和一个朋友variables: data class User ( val username: String, @ManyToMany(fetch = FetchType.EAGER) @JoinTable( name = “users_friends”, joinColumns = arrayOf(JoinColumn(name = “user_id”, referencedColumnName = “id”)), inverseJoinColumns = arrayOf(JoinColumn(name = “friends_id”, referencedColumnName = “id”))) val friends: Collection?) 我从一个springboot控制器调用内置的kotlin函数getFriends(): @ApiOperation(“Get Friends”) @RequestMapping(value = “/friends”, method = RequestMethod.GET) public Collection getFriends(@RequestParam final String username) { return userService.getFriends(userService.findByUsername(username).get()); } 其中调用该服务: @Override […]
添加以下依赖项: compile(“com.fasterxml.jackson.module:jackson-module-parameter-names:2.8.9”) compile(“com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.8.9”) compile(“com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.9”) 我现在可以通过即时反序列化以下JSON: { “timestamp”: {{$timestamp}} } 到以下对象: Transaction(timestamp=2017-07-02T10:58:18Z) 用下面的类声明 data class Transaction(@NotNull val timestamp: Instant) 但是,当立即序列化后,我得到以下几点: { “timestamp”: 1498992172 } 我正在用Kotlin使用Spring Boot 。
假设我们有一个JsonNode对象jsonNodeObj ,它需要被分析到多个类ClassA , ClassB , ClassC等中的一个。我可以这样做(不能更丑陋): val mapper = ObjectMapper() try { mapper.treeToValue(jsonNodeObj, ClassA::class.java) } catch (e1: Exception) { try { mapper.treeToValue(jsonNodeObj, ClassB::class.java) } catch (e2: Exception) { try { mapper.treeToValue(jsonNodeObj, ClassC::class.java) } catch (e3: Exception) { … } } } 有什么更好的方式就像用when方式?
我正在处理一个API,它返回XML如下所示: 1000000714 DL 11 Jul, 2017, 17:40 我正在使用jackson的XML映射器。 我试图为此写一个POJO对象,但这是行不通的。 如何处理types和名称等元素的属性? 你能举例说明吗?