首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON输出包含星号而不是值。

JSON输出包含星号而不是值。
EN

Stack Overflow用户
提问于 2019-09-02 09:11:14
回答 1查看 559关注 0票数 1

当我使用com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(payload)从一个对象获取一个json字符串时,我发现一些字段有星号而不是值。如下所示:

代码语言:javascript
复制
{
    "id": "25495867-1404-412d-9488-ce495bd468de",
    "createdDate": "2019-09-01T22:27:46.000Z",
    "updatedDate": "2019-09-01T22:27:46.000Z",
    "externalKey": "testhc1",
    "email": **********************,
    "name": ************,
    "currency": "NZD"
}

emailname在我的有效负载对象中都有值,我看不出这些字段有什么奇怪的地方。但是很明显,jackson代码是这样的。不仅值是模糊的,而且产生的星号没有在引号中,因此对于这个过程的另一端成功解析来说,它们不是有效的json

有人知道是什么引发了这种行为吗?我花了一天时间看代码却什么也没发现。未对有效负载对象进行注释,但我尝试了其他工作良好的未注释对象。

编辑1029/09/03我正在编写的代码是一个用于基尔比尔的插件,在该环境之外运行时,它的行为似乎有所不同。我写了一个小测试:

代码语言:javascript
复制
UUID accountId = UUID.fromString("25495867-1404-412d-9488-ce495bd468de");
DefaultAccount account = new DefaultAccount(
        accountId, "external", "abc@gmail.com",
        "fred smith", 4, Currency.NZD, null, false, 
        20, null, new DateTime(), DateTimeZone.UTC,
        Locale.getDefault().toString(), "addr1", 
        "addr2", "companyName", "city",
        "stateOrProvince", "country", 
        "postalCode", "phone", "notes", false);
try {
    String json = invoiceNotificationHttpClient.getMapper().writeValueAsString(account);
    logger.info("testMapper: {} " ,json);
} catch (JsonProcessingException e) {
    logger.error(e.getMessage(),e);
}

直接(在KillBill外)运行测试的结果给出了我期望的结果

代码语言:javascript
复制
{
    "id": "25495867-1404-412d-9488-ce495bd468de",
    "externalKey": "external",
    "email": "abc@gmail.com",
    "name": "fred smith",
    "firstNameLength": 4,
    "currency": "NZD",
...
}

我取了这个确切的代码,并将它粘贴到我的插件中。您可以看到,我只是实例化一个类并在其上运行映射器。当作为插件运行时,结果是:

代码语言:javascript
复制
{
    "id": "25495867-1404-412d-9488-ce495bd468de",
    "externalKey": "external",
    "email": ***************,
    "name": ************,
    "firstNameLength": 4,
    "currency": "NZD",
...
}

这是我的星号。所以它不是类本身,它看起来可能是映射器。所以我看了看。

映射器确实来自于框架,但我有它的来源。我扩展了给定的类org.killbill.billing.plugin.util.http.HttpClient以生成InvoiceNotificationHttpClient。所以在我的课上有一种方法:

代码语言:javascript
复制
    protected ObjectMapper createObjectMapper() {
        return super
                .createObjectMapper()
                .registerModule(new JodaModule())
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    }   

这是调用超类并添加我对Joda所需的内容。在超级阶级中:

代码语言:javascript
复制
    protected ObjectMapper createObjectMapper() {
        final ObjectMapper mapper = new ObjectMapper();

        // Tells the serializer to only include those parameters that are not null
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        // Allow special characters
        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);

        // Write dates using a ISO-8601 compliant notation
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

        return mapper;
    }

我觉得很高兴。无论如何,这应该和我在独立运行时的情况一样。

再编辑2019-09-03

当我作为插件运行时,我开始认为我一定得到了一个不同的ObjectMapper。我将上述ObjectMapper的实例化和配置移到插件中的自己的方法中,并作为测试进行了尝试。同样的技术仍然很好地独立工作,而且在插件中不起作用。因此,new ObjectMapper()似乎给了我一些不同的东西在这些环境中。这可能是现在的OSGi问题了。我会更新标签。

EN

回答 1

Stack Overflow用户

发布于 2019-09-03 23:06:32

这是一条彻头彻尾的红鲱鱼,但我会贴出答案,以防它对别人有帮助。星号并不是由杰克逊ObjectMapper的任何奇怪之处引起的。它们也不是由OSGi配置中的任何奇怪的类路径问题引起的。我花了很长时间来寻找这些问题,却一无所获。

它们是由logback配置中的一个logback造成的,该配置旨在掩盖这些特定字段在日志中出现的情况。这是一个合理的要求,但我不知道我正在嵌入的服务器--我的OSGi插件就是这样做的。结果,当我关闭转换时,字段就很好了。当我运行桌面测试时,它们有一个更简单的logback配置,不包括conversionRule,因此它从未出现在那里。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57754266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档