Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSON输出包含星号而不是值_Java_Json_Jackson_Osgi - Fatal编程技术网

Java JSON输出包含星号而不是值

Java JSON输出包含星号而不是值,java,json,jackson,osgi,Java,Json,Jackson,Osgi,当我使用com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(有效载荷)从对象中获取json字符串时,我发现一些字段有星号而不是值。像这样: { "id": "25495867-1404-412d-9488-ce495bd468de", "createdDate": "2019-09-01T22:27:46.000Z", "updatedDate": "2019-09-01T22:27:46.000Z

当我使用
com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(有效载荷)
从对象中获取
json
字符串时,我发现一些字段有星号而不是值。像这样:

{
    "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"
}
email
name
在我的有效负载对象中都有值,我看不到这些字段有什么奇怪的地方。但显然,杰克逊的代码确实如此。不仅值被模糊,而且结果的星号不在引号中,因此它们对于该过程的另一端来说是无效的
json

有人知道是什么触发了这种行为吗?我花了一天的时间看代码,没有发现任何东西。负载对象没有注释,但我尝试过其他工作正常的未注释对象


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

UUID accountId=UUID.fromString(“25495867-1404-412d-9488-ce495bd468de”);
DefaultAccount=新的DefaultAccount(
accountId,“外部”abc@gmail.com",
“fred smith”,4,Currency.NZD,空,假,
20,null,new DateTime(),DateTimeZone.UTC,
Locale.getDefault().toString(),“addr1”,
“地址2”、“公司名称”、“城市”,
“州或省”、“国家”,
“邮政编码”、“电话”、“备注”、虚假);
试一试{
字符串json=invoiceNotificationHttpClient.getMapper().writeValueAsString(帐户);
info(“testMapper:{}”,json);
}捕获(JsonProcessingException e){
logger.error(e.getMessage(),e);
}
直接运行测试的结果(即在KillBill之外)给出了我期望的结果,即

{
    "id": "25495867-1404-412d-9488-ce495bd468de",
    "externalKey": "external",
    "email": "abc@gmail.com",
    "name": "fred smith",
    "firstNameLength": 4,
    "currency": "NZD",
...
}
我将这段代码粘贴到我的插件中。您可以看到,我只是实例化了一个类并在其上运行映射程序。作为插件运行时,结果如下:

{
    "id": "25495867-1404-412d-9488-ce495bd468de",
    "externalKey": "external",
    "email": ***************,
    "name": ************,
    "firstNameLength": 4,
    "currency": "NZD",
...
}
这是我的星号。所以它不是类本身,它看起来可能是映射器。所以我看了一下

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

protectedobjectmapper createObjectMapper(){
返回超级
.createObjectMapper()
.registerModule(新的JodaModule())
.disable(序列化功能。将日期写入时间戳);
}   
这是调用超类并添加Joda所需的内容。在超类中:

protectedobjectmapper createObjectMapper(){
最终ObjectMapper映射器=新ObjectMapper();
//告诉序列化程序仅包含那些不为null的参数
setSerializationInclusion(JsonInclude.Include.NON_NULL);
//允许特殊字符
configure(JsonParser.Feature.ALLOW\u UNQUOTED\u CONTROL\u CHARS,true);
//使用符合ISO-8601的表示法写入日期
configure(SerializationFeature.WRITE_DATES_作为时间戳,false);
返回映射器;
}
这对我来说已经足够快乐了。它应该是一样的,当我运行独立的反正


再次编辑2019-09-03


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

这完全是在转移注意力,但我会发布答案,以防对其他人有所帮助。星号不是由jackson
ObjectMapper
中的任何异常引起的。它们也不是由OSGi配置中任何奇怪的类路径问题引起的。我花了很长时间寻找这些问题,但什么也没找到


它们是由
logback
配置中的
conversionRule
引起的,该配置旨在屏蔽日志中出现的特定字段。这是一个合理的要求,但我不知道嵌入OSGi插件的服务器正在这样做。事实证明,当我关闭转换时,字段就很好了。当我运行我的桌面测试时,他们有一个更简单的
logback
配置,它没有包含
conversionRule
,因此它从未出现在那里。

这完全是一个骗局,但我会发布答案,以防对其他人有所帮助。星号不是由jackson
ObjectMapper
中的任何异常引起的。它们也不是由OSGi配置中任何奇怪的类路径问题引起的。我花了很长时间寻找这些问题,但什么也没找到


它们是由
logback
配置中的
conversionRule
引起的,该配置旨在屏蔽日志中出现的特定字段。这是一个合理的要求,但我不知道嵌入OSGi插件的服务器正在这样做。事实证明,当我关闭转换时,字段就很好了。当我运行我的桌面测试时,他们有一个更简单的
logback
配置,它没有包含
conversionRule
,因此它从未出现在那里。

名称
电子邮件
字段的Java类型是什么?它们是
String
s还是其他什么?在问题中包含包含这些字段的对象的源代码会很有用。您可以使用逐步调试吗?看起来这是识别罪犯的最简单方法。默认情况下,Jackson不会为任何
POJO
生成错误的
JSON
。它将对象序列化为va