最近接到一个需求,要求只JSON序列化简单类型字段,复杂类型字段直接忽略。我这不想到了Gson的json适配器么。这里记录下
java
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import lombok.Data;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@Data
public class OrderDto {
private String orderId;
private List<OrderTicketDto> tickets;
@Data
@JsonAdapter(OrderTicketDtoTypeAdapter.class)
public static class OrderTicketDto{
private Map<String,Object> ticketWrapper;
}
static class OrderTicketDtoTypeAdapter extends TypeAdapter<OrderTicketDto> {
@Override
public void write(JsonWriter out, OrderTicketDto value) throws IOException {
out.beginObject();
if (value.getTicketWrapper() != null) {
for (Map.Entry<String, Object> entry : value.getTicketWrapper().entrySet()) {
String key = entry.getKey();
Object val = entry.getValue();
boolean isSimpleType = val instanceof String || val instanceof Number || val instanceof Boolean;
if (isSimpleType) {
out.name(key);
if (val instanceof String) {
out.value((String) val);
} else if (val instanceof Number) {
out.value((Number) val);
} else if (val instanceof Boolean) {
out.value((Boolean) val);
} else {
out.nullValue();
}
}
}
}
out.endObject();
}
@Override
public OrderTicketDto read(JsonReader in) throws IOException {
OrderTicketDto ticketDto = new OrderTicketDto();
Map<String, Object> ticketWrapper = new java.util.HashMap<>();
in.beginObject();
while (in.hasNext()) {
String name = in.nextName();
switch (in.peek()){
case STRING:
ticketWrapper.put(name, in.nextString());
break;
case NUMBER:
ticketWrapper.put(name, in.nextDouble());
break;
case BOOLEAN:
ticketWrapper.put(name, in.nextBoolean());
break;
default:
in.skipValue();
break;
}
}
in.endObject();
ticketDto.setTicketWrapper(ticketWrapper);
return ticketDto;
}
}
}