当前位置: 首页 > 知识库问答 >
问题:

用于Java返回值的空手道自定义序列化程序

谭光辉
2023-03-14

假设我有这样一个Java类:

package com.example;
public class PersonUtil {
    static class Person {
        LocalDate dob;
        String name;
        Person(LocalDate dob, String name) { this.dob = dob; this.name = name;}
    }

    public static Person person() {
        return new Person(LocalDate.now(), "bob");
    }
}

然后我有了common。功能文件如下:

@ignore
Feature:

Scenario:
    * def personUtil = Java.type('com.example.PersonUtil')

然后是这样的test.feature文件:

Feature: Create Person

Background:
  * def util = call read('common.feature')
  * print util.personUtil.person();

问题是功能文件中的dob字段看起来像以下结构:

{"dob": {"year":2019, 
    "month":"MAY", 
    "monthValue":5, 
    "dayOfMonth":1, 
    "leapYear":false, 
    "dayOfWeek":"WEDNESDAY", 
    "dayOfYear":121, 
    "era": "CE", 
    "chronology": {
        "id":"ISO", 
         "calendarType":"iso8601"
        }}, 
 "name":"bob"}

但是我希望它使用DateFormatter,这样输出就

{"dob": "2019-05-1", "name":"bob"}

有没有一种方法可以在不创建另一个DTO和自己进行LocalDate格式化的情况下使用空手道做到这一点?

共有2个答案

曹季同
2023-03-14

@Peter Thomas,谢谢,这确实有效,但它让我思考了更多,我最终做的是重用ObjectMapper的一个UTIL将对象序列化为JSON(ObjectMapper处理所有类型转换)。然后,我将调用包装为使用serialise函数获取Java对象,并将结果转换回功能文件中的json,如下所示:

和以前一样,但有新的序列化助手:

package com.example;
public class PersonUtil {
    static class Person {
        LocalDate dob;
        String name;
        Person(LocalDate dob, String name) { this.dob = dob; this.name = name;}
    }

    public static Person person() {
        return new Person(LocalDate.now(), "bob");
    }

    public static String serialise(Object o) throws JsonProcessingException {
        return ObjectMapperUtils.createObjectMapper().writeValueAsString(o);
    }
}

类似于以前,但现在包装调用序列化助手:

Feature: Create Person

Background:
  * def util = call read('common.feature')
  * json person = util.personUtil.serialise(util.personUtil.person());
  * print person

这样,我就不需要为每种需要特殊转换的Java对象类型做新的映射。

连鸿
2023-03-14

是的,试试这个:

* def mapper = function(x){ return { name: x.name, dob: x.dob.toString() } }
* def person = mapper(util.personUtil.person())
* print person

从上面来看,你应该很容易弄清楚如何进行任何类型的转换。

 类似资料:
  • 根据这个答案:https://stackoverflow.com/a/43342675/5810648 我编写了这样的序列化程序: 如果注释存在并且字段为,则Witch应该编写字符串“N/A”。但是方法仅对非空字段调用。 此外,我还尝试调用setNullValueSerializer: 有了这样的实施: 但没有结果。 如何以这种方式处理空字段? 使现代化 根据讨论:https://github.c

  • 问题内容: 我正在尝试创建将影响序列化值的自定义杰克逊注释。 含义: 现在序列化对象X(10)将导致: 我该如何实现? 问题答案: 结果:

  • 问题内容: 根据这个答案:http://codingdict.com/questions/137507 我写了这样的序列化器: 如果注释存在且字段为,则女巫应该写字符串“ N / A” 。但是仅对非空字段调用方法。 另外,我尝试致电: 通过这样的实现: 但是没有结果。 如何以这种方式处理空字段? 更新资料 根据讨论:https : //github.com/FasterXML/jackson- d

  • 问题内容: 我有一个对象,其中包含一些要序列化的不可序列化字段。它们来自我无法更改的单独API,因此使它们可序列化不是一种选择。主要问题是Location类。它包含我需要的四个可以序列化的东西,所有整数。如何使用read / writeObject创建可以执行以下操作的自定义序列化方法: 我怎样才能做到这一点? 问题答案: Java支持自定义序列化。阅读“自定义默认协议”部分。 去引用: 但是,有

  • 我试图创建会影响序列化值的自定义jackson注释。 意思是: 现在序列化对象X(10)将导致: 我怎样才能做到这一点?

  • 对于Jackson的序列化,定义自定义bean为空的正确方法是什么? 我想用Json过滤不需要的字段- 目前,如果属于自定义bean的所有变量都为null,我有一个额外的方法将null值分配给它。我在寻找的是,这是否可以由杰克逊来完成。 内容识别类 预期产量 和 电流输出 和