@Test
void test() {
var objectMapper = new ObjectMapper();
// serialize
var user = new UserRequest(
"geuno", "rlfrmsdh1@gmail.com", 20);
var text = objectMapper.writeValueAsString(user);
System.out.println(text);
// deserialize
var objectUser = objectMapper.readValue(text, UserRequest.class);
System.out.println(objectUser);
}
// BeanSerializer.java
@Override
public final void serialize(Object bean, JsonGenerator gen, SerializerProvider provider)
throws IOException
{
if (_objectIdWriter != null) {
gen.setCurrentValue(bean); // [databind#631]
_serializeWithObjectId(bean, gen, provider, true);
return;
}
gen.writeStartObject(bean);
if (_propertyFilterId != null) {
serializeFieldsFiltered(bean, gen, provider);
} else {
serializeFields(bean, gen, provider);
}
gen.writeEndObject();
}
//serializeFields
protected void serializeFields(Object bean, JsonGenerator gen, SerializerProvider provider)
throws IOException
{
final BeanPropertyWriter[] props;
if (_filteredProps != null && provider.getActiveView() != null) {
props = _filteredProps;
} else {
props = _props;
}
int i = 0;
try {
for (final int len = props.length; i < len; ++i) {
BeanPropertyWriter prop = props[i];
if (prop != null) { // can have nulls in filtered list
prop.serializeAsField(bean, gen, provider);
}
}
if (_anyGetterWriter != null) {
_anyGetterWriter.getAndSerialize(bean, gen, provider);
}
,,,
}
private final Object vanillaDeserialize(JsonParser p,
DeserializationContext ctxt, JsonToken t)
throws IOException
{
final Object bean = _valueInstantiator.createUsingDefault(ctxt);
// [databind#631]: Assign current value, to be accessible by custom serializers
p.setCurrentValue(bean);
if (p.hasTokenId(JsonTokenId.ID_FIELD_NAME)) {
String propName = p.currentName();
do {
...'
}
15) "createdAt"
16) "2023-04-04 15:44:38"
Java 8 date/time type `java.time.LocalDateTime` not supported by default:
add Module \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\"
to enable handling\n at [Source: UNKNOWN; byte offset: #UNKNOWN]
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3'
ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule());
Cannot deserialize value of type `java.time.LocalDateTime` from
String \"2023-04-04 15:44:38\":
Failed to deserialize java.time.LocalDateTime:
(java.time.format.DateTimeParseException) Text '2023-04-04 15:44:38'
culd not be parsed at index 10
JsonFormat 명시하지 않을 시 발생하는 에러
public class Room {
@Id
private Integer id;
private Integer channelId;
private int roomType;
private String roomName;
private Integer hostId;
private int userCnt;
private int maxUserCnt;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createdAt;
}
// json 파일로부터 객체 읽기
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(new File("./src/main/java/sample.json"), User.class);
System.out.println(user);
// json array로 부터 리스트 뽑기
List<User> users = objectMapper.readValue<List<User>>(new File("./src/main/java/sample.json"));
// json의 요소별로 값을 얻고 싶을때
String json = objectMapper.writeValueAsString(user);
JsonNode jsonNode = objectMapper.readTree(json);
String _name = jsonNode.get("name").asText();
int _age = jsonNode.get("age").asInt();
JsonNode cars = jsonNode.get("cars");
ArrayNode arrayNode = (ArrayNode) cars;
List<Car> _cars = objectMapper.convertValue(arrayNode, new TypeReference<List<Car>>() {});
//json의 요소 값을 변경하고싶을때
ObjectNode objectNode = (ObjectNode) jsonNode;
objectNode.put("name", "steve");
objectNode.put("age", 20);
System.out.println(objectNode.toPrettyString());
ObjectNode node = objectMapper.createObjectNode();
ObjectNode articleNode = node.putObject("article");
articleNode.put("title", article.getTitle());
articleNode.put("description", article.getDescription());
articleNode.put("body", article.getBody());
ArrayNode tagList = articleNode.putArray("tagList");
for(Tag tag : article.getTags())
tagList.add(tag.getName());
/*
{
"article": {
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "You have to believe",
"tagList": ["reactjs", "angularjs", "dragons"]
}
}
*/