Nếu hợp lý để thay đổi cấu trúc dữ liệu ban đầu được nối tiếp để đại diện tốt hơn giá trị thực tế muốn được tuần tự hóa, đó có thể là cách tiếp cận phù hợp, điều này có thể làm giảm số lượng cấu hình Jackson cần thiết. Ví dụ: chỉ cần xóa các mục nhập chính null
, nếu có thể, trước khi gọi cho Jackson. Điều đó nói rằng ...
Để ngăn chặn serializing Map
mục với giá trị null:
Trước Jackson 2,9
bạn vẫn có thể tận dụng WRITE_NULL_MAP_VALUES
, nhưng lưu ý rằng nó chuyển đến SerializationFeature
:
mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
Vì Jackson 2,9
Các WRITE_NULL_MAP_VALUES
bị phản đối, bạn có thể sử dụng tương đương dưới đây:
mapper.setDefaultPropertyInclusion(
JsonInclude.Value.construct(Include.ALWAYS, Include.NON_NULL))
Để ngăn chặn serializing tính với các giá trị null, bạn có thể configure the ObjectMapper
directly, hoặc tận dụng các @JsonInclude
chú thích:
mapper.setSerializationInclusion(Include.NON_NULL);
hoặc:
@JsonInclude(Include.NON_NULL)
class Foo
{
public String bar;
Foo(String bar)
{
this.bar = bar;
}
}
Để xử lý null Map
khóa, một số tùy chỉnh tuần tự là cần thiết, như tôi hiểu rõ nhất.
Một cách tiếp cận đơn giản để serialize null
phím như chuỗi rỗng (bao gồm cả ví dụ hoàn chỉnh của hai cấu hình đề cập ở trên):
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
public class JacksonFoo
{
public static void main(String[] args) throws Exception
{
Map<String, Foo> foos = new HashMap<String, Foo>();
foos.put("foo1", new Foo("foo1"));
foos.put("foo2", new Foo(null));
foos.put("foo3", null);
foos.put(null, new Foo("foo4"));
// System.out.println(new ObjectMapper().writeValueAsString(foos));
// Exception: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
mapper.setSerializationInclusion(Include.NON_NULL);
mapper.getSerializerProvider().setNullKeySerializer(new MyNullKeySerializer());
System.out.println(mapper.writeValueAsString(foos));
// output:
// {"":{"bar":"foo4"},"foo2":{},"foo1":{"bar":"foo1"}}
}
}
class MyNullKeySerializer extends JsonSerializer<Object>
{
@Override
public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused)
throws IOException, JsonProcessingException
{
jsonGenerator.writeFieldName("");
}
}
class Foo
{
public String bar;
Foo(String bar)
{
this.bar = bar;
}
}
Để ngăn chặn serializing Map
mục với null
phím, chế biến serialization thêm tùy chỉnh sẽ là cần thiết.
Có thể trùng lặp, vui lòng kiểm tra liên kết này: http://stackoverflow.com/questions/3140563/how-to-avoi d-null-values-serialization-in-hashmap – dbf
Bản đồ có thể có tối thiểu một khóa rỗng – amicngh
@dbf không hoàn toàn. vui lòng xem lại tiêu đề câu hỏi đã chỉnh sửa. – Inquisitive