- 实现Serializable: 保持序列化和反序列化对象的一致性
- Serializing private variables in java? private成员变量可以被序列化
父类实现接口后,所有派生类的属性都会被序列化。子类实现接口的话,父类的属性值丢失。
JSON库
配置
public final class JsonUtils {
private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);
private static final TypeReference<HashMap<String, Object>> HASH_MAP_TYPE = new TypeReference<HashMap<String, Object>>() {
};
private static final TypeReference<ArrayList<Object>> LIST_TYPE = new TypeReference<ArrayList<Object>>() {
};
private static final ObjectMapper mapper = new ObjectMapper();
static {
mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true);
mapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setSerializationInclusion(Include.NON_NULL);
}
}
创建JsonNode
ArrayNode labels = JsonNodeFactory.instance.arrayNode()
String => List
注意:TypeReference中如果是抽象类,需要定义@JsonTypeInfo
String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
ObjectMapper objectMapper = new ObjectMapper();
List<Car> cars1 = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>(){});
Object => String
```java mapper.writeValueAsString(object)
mapper.writerFor(type).writeValueAsString(object)
<a name="aB1rL"></a>
## @JsonTypeInfo多态处理
[@JsonTypeInfo 多态类型处理](https://www.jianshu.com/p/a21f1633d79c)
```java
@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS)
@JsonSubTypes({
@JsonSubTypes.Type(value = GeneralOrderItem.class),
@JsonSubTypes.Type(value = QuantityOrderItem.class),
@JsonSubTypes.Type(value = SitesOrderItem.class),
})
public abstract class BaseOrderItem implements Serializable {
private static final long serialVersionUID = 9038806540511318608L;
private DeepdrawService.Type serviceType;
}
注意,Collection类型要使@JsonTypeInfo生效,必须使用mapper.writeFor(type) => Github-issue
@Test
public void toTypedJson_happyPath() {
SitesOrderItem item = new SitesOrderItem();
item.setServiceType(Type.DISTRIBUTION);
List<SitesOrderItem> items = Arrays.asList(item);
assertThat(JsonUtils.toJson(items, new TypeReference<List<BaseOrderItem>>() {
}), is("[{\"@c\":\".SitesOrderItem\",\"serviceType\":\"DISTRIBUTION\"}]"));
}
public static String toJson(Object object, TypeReference<?> type) {
try {
return mapper.writerFor(type).writeValueAsString(object);
} catch (JsonProcessingException var3) {
logger.error("Cannot format json : " + object, var3);
return "{}";
}
}
LocalDate的序列化和反序列化
jackson-modules-java8
注意只能用2.9及以下,以上报错
compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-parameter-names', version: '2.9.9'
compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jdk8', version: '2.9.9'
compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.9'
Transient关键字
- transient关键字用法,注意与@Transient注解的区别
注解
Jackson API Jackson @JsonProperty and @JsonAlias Example
jackson包含属性、忽略属性的注解
注解类 | 描述 | 场景 | |
---|---|---|---|
1 | JsonIgnoreProperties | 用于标记忽略一个或多个属性。可以注解在类上、构造函数、方法、字段上。 | oneToMany, ManyToMany 字段防止死循环 |
2 | JsonIgnore | @JsonIgnore注解用于在字段级别标记要忽略的属性。注意:系列化和反系列化时都会被忽略。 | 敏感字段 |
3 | JsonInclude | 使用@JsonInclude可以只包含非空的属性,也即排除值为empty、null的属性。 | |
4 | JsonAutoDetect | 默认情况下,jackson获取public权限的字段进行序列化和反序列化。如果没有public修饰的字段,就会去获取public修饰的getter/setter。使用 JsonAutoDetect注解,我们就可以修改默认的行为。 |
问题
"[{}, {}]"
读取后得到的arraynode进行遍历,每项是个空的ObjectNode,.path(“xxx”)得到missingNode- 属性不要is开头