- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当使用以下 JSON 并且“phones”或“emailAddresses”为空时,我将收到 NullPointerException。
JSON:
{
"item": {
"messages": {
"user.phone.missing": {
"type": "warning",
"key": "user.phone.missing",
"message": "User profile does not have a phone number",
"code": null
},
"user.email.missing": {
"type": "warning",
"key": "user.email.missing",
"message": "User profile does not have an email address",
"code": null
},
"user.es.sync.failed": {
"type": "error",
"key": "user.es.sync.failed",
"message": "Unable to sync user",
"code": null
}
},
"user": {
"firstName": "Test",
"middleInitial": null,
"lastName": "User",
"createdDt": "2016-04-20 19:50:03+0000",
"updatedDt": null,
"lastVerifiedDt": null,
"status": "DEACTIVATED",
"tokens": [
{
"tokenHash": "test hash",
"tokenValue": "test dn",
"createdDt": "2016-04-20 19:50:03+0000",
"updatedDt": null,
"status": "ENABLED"
}
],
"phones": null,
"emailAddresses": null
}
},
"status": "SUCCESS",
"errors": []
}
这是堆栈跟踪:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: N/A (through reference chain: com.test.message.cte.CteItemResponse["item"]->com.test.message.cte.CteUserContext["user"]->com.test.User["phones"])
at com.fasterxml.jackson.databind.deser.SettableBeanProperty._throwAsIOE(SettableBeanProperty.java:510)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty._throwAsIOE(SettableBeanProperty.java:493)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.set(MethodProperty.java:116)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:464)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:464)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2041)
at com.test.Test.main(Test.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.NullPointerException
at com.test.User.setPhones(User.java:202)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.set(MethodProperty.java:114)
... 19 more
我正在像这样设置我的自定义 ObjectMapper:
package com.test;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.ISO8601DateFormat;
public class MigrationObjectMapper extends ObjectMapper {
private MigrationObjectMapper() {
// do not serialize null value fields
this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public static MigrationObjectMapper getMigrationObjectMapper(){
return new MigrationObjectMapper();
}
}
这意味着 CteUserContext cteUserContext = MigrationObjectMapper.getMigrationObjectMapper().convertValue(item.getItem(), new TypeReference<CteUserContext>(){});
正在抛出错误。
CteUserContext内部是一个User对象,里面包含了List和List。难道这些不应该基于对象映射器配置进行序列化吗?
最佳答案
根据 Rocki 的评论:
setSerializationInclusion will ignore null values only for serialization not deserialization.
如果传入的“phones”值在我的 User 类中为空,我没有处理,所以它抛出了 NPE。我已经更新以确认它不为空。如果是,它将在任何其他逻辑之前短路:
/**
* @param phones The phones
*/
@JsonProperty("phones")
public void setPhones(List<Phone> phones) {
if ((phones != null) && (phones.size() > 1)) {
int primaryIndex = -1;
Phone primaryPhone = null;
for (Phone p : phones) {
if (p.getIsPrimary()) {
primaryIndex = phones.indexOf(p);
primaryPhone = p;
break;
}
}
phones.remove(primaryIndex);
phones.add(0, primaryPhone);
}
this.phones = phones;
}
关于java - Jackson ObjectMapper 即使使用 NON_NULL 也会抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36754835/
目前我的应用程序有一个类如下 @JsonInclude(JsonInclude.Include.NON_NULL) public class Employee { Department depar
我在 Response 类上添加了 @JsonInclude(Include.NON_NULL) 注释。 @JsonInclude(Include.NON_NULL) public class Res
我通常使用 objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL) 因为我从不想序列化类的空值。除了现在我有一
我正在使用 Spring Boot 1.5.7-发布 . 我正在尝试设置 全局非空 我的应用程序中的 Jackson 属性。 但它不起作用。 我在 application.properties 和 b
我用 @JsonInclude(JsonInclude.Include.NON_NULL) 注释了 POJO,以在序列化/反序列化时排除所有 null 字段。但现在我需要从这种行为中排除其中一个字段。
在 route!=0 的情况下,我正在尝试检索 {"status":201} 但我得到的是 {"status":201 "distance":0.0} 如何使用 @JsonInclude 或 Jack
当使用以下 JSON 并且“phones”或“emailAddresses”为空时,我将收到 NullPointerException。 JSON: { "item": { "messag
我已经在类/pojo 上放置了注释并配置了映射器,但它仍然序列化 null 值 我正在使用 Hibernate 4.3.7Final 和 Jackson 2.4.4。这些集合是延迟加载 Pojo:删除
我试图了解 @JsonInclude 存在的原因是什么,以便在我的 DTO 中使用它。让我们看一下这个简单的例子: 代码: class DemoApplication { static voi
我是 Obj-C 的新手,但我正在尝试在 Xcode 7 上构建一些以前在 Xcode 6 中运行的代码。具体来说,我遇到了这个问题: [_webView loadData:[_text dataUs
问题: 是否可以在创建 ObjectMapper 时覆盖 POJO 中定义的 Include.NON_NULL? 解释: 假设我有一个如下所示的 POJO: @JsonInclude(Include.
我有一个像这样的模型类: @JsonInclude(JsonInclude.Include.NON_NULL) public class Defect 我需要 JsonInclude.Include.
我有一个使用 Apache CXF 的 JAX-RS API。最近我从 Jettison 切换到 Jackson (2.7.1) 来处理 JSON。我正在使用 JacksonJaxbJsonProvi
我正在尝试通过 application.yml 文件在应用程序级别添加 jackson 注释。但是当我运行应用程序时,jackson 注释被忽略并且响应也具有 null 属性。有人帮我吗?我在我的 a
我是一名优秀的程序员,十分优秀!