SpringBoot 는 하위 클래스 의 반 직렬 화 예제 코드 를 실현 합 니 다.
6608 단어 springboot하위 클래스역 직렬 화
SpringBoot 인터페이스 에서 우 리 는 보통@RequestBody 류 주석 으로 반 직렬 화 대상 이 필요 하지만 여러 개의 하위 클래스 가 존재 하 는 상황 에서 일반적인 반 직렬 화 는 수 요 를 만족 시 키 지 못 합 니 다.예 를 들 어:
우 리 는 시험 지 를 표시 하 는 데 사용 되 는 클래스 Exam 이 있 습 니 다.
@Data
public class Exam {
private String name;
private List<Question> questions;
}
여기 서 Question 은 비교적 특수 하 다.Question 자 체 는 추상 적 인 유형 으로 통용 되 는 방법 을 제공 했다.실제 서브 클래스 는 단일 선택 문제,다 중 선택 문제,판단 문제 등 여러 가지 상황 이 있다.이루어지다
Sprint Boot 에 내 장 된 직렬 화 는 Jackson 을 사용 합 니 다.문 서 를 찾 아 보 니 Jackson 은@JSonTypeInfo 와@JSonSubTypes 라 는 두 개의 주 해 를 제공 하고 조합 하여 사용 합 니 다.지정 한 필드 값 에 따라 구체 적 인 하위 클래스 유형 을 지정 할 수 있 습 니 다.
이 몇 가지 종류의 실제 코드 는 다음 과 같다.
추상 기본 질문:
@Data
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "type",
visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = SingleChoiceQuestion.class, name = Question.SINGLE_CHOICE),
@JsonSubTypes.Type(value = MultipleChoiceQuestion.class, name = Question.MULTIPLE_CHOICE),
@JsonSubTypes.Type(value = TrueOrFalseQuestion.class, name = Question.TRUE_OR_FALSE),
})
public abstract class Question {
protected static final String SINGLE_CHOICE = "single_choice";
protected static final String MULTIPLE_CHOICE = "multiple_choice";
protected static final String TRUE_OR_FALSE = "true_or_false";
protected String type;
protected String content;
protected String answer;
protected boolean isCorrect(String answer) {
return this.answer.equals(answer);
}
}
판단 문제 TrueOrFalseQuestion:
@Data
@EqualsAndHashCode(callSuper = true)
public class TrueOrFalseQuestion extends Question {
public TrueOrFalseQuestion() {
this.type = TRUE_OR_FALSE;
}
}
선택 문제 ChoiceQuestion:
@Data
@EqualsAndHashCode(callSuper = true)
public abstract class ChoiceQuestion extends Question {
private List<Option> options;
@Data
public static class Option {
private String code;
private String content;
}
}
단일 선택 문제 Single ChoiceQuestion:
@Data
@EqualsAndHashCode(callSuper = true)
public class SingleChoiceQuestion extends ChoiceQuestion {
public SingleChoiceQuestion() {
this.type = SINGLE_CHOICE;
}
}
다 중 선택 문제 Multiple ChoiceQuestion:
@Data
@EqualsAndHashCode(callSuper = true)
public class MultipleChoiceQuestion extends ChoiceQuestion {
public MultipleChoiceQuestion() {
this.type = MULTIPLE_CHOICE;
}
@Override
public void setAnswer(String answer) {
this.answer = sortString(answer);
}
@Override
public boolean isCorrect(String answer) {
return this.answer.equals(sortString(answer));
}
private String sortString(String str) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
return String.valueOf(chars);
}
}
테스트이제 테스트 를 해 보도 록 하 겠 습 니 다.
인 터 페 이 스 를 정의 합 니 다.@RequestBody 를 사용 하여 Exam 대상 을 전송 하고 분석 결 과 를 되 돌려 줍 니 다.
@RequestMapping(value = "/exam", method = RequestMethod.POST)
public List<String> parseExam(@RequestBody Exam exam) {
List<String> results = new ArrayList<>();
results.add(String.format("Parsed an exam, name = %s", exam.getName()));
results.add(String.format("Exam has %s questions", exam.getQuestions().size()))
List<String> types = new ArrayList<>();
for (Question question : exam.getQuestions()) {
types.add(question.getType());
}
results.add(String.format("Questions types: %s", types.toString()));
return results;
}
프로젝트 가 달 려 서 인 터 페 이 스 를 호출 하여 테스트 합 니 다.
curl -X POST \
http://127.0.0.1:8080/exam/ \
-H 'Content-Type: application/json' \
-d '{
"name":" ",
"questions": [
{
"type": "single_choice",
"content": " ",
"options": [
{
"code":"A",
"content": " A"
},{
"code":"B",
"content": " B"
}],
"answer": "A"
},{
"type": "multiple_choice",
"content": " ",
"options": [
{
"code":"A",
"content": " A"
},{
"code":"B",
"content": " B"
}],
"answer": "AB"
},{
"type": "true_or_false",
"content": " ",
"answer": "True"
}]
}'
인 터 페 이 스 는 다음 과 같 습 니 다:
[
"Parsed an exam, name = ",
"Exam has 3 questions",
"Questions types: [single_choice, multiple_choice, true_or_false]"
]
여기 서 서로 다른 유형의 question,type 필드 를 정확하게 읽 을 수 있 습 니 다.이 는 반 직렬 화 과정 에서 구체 적 인 하위 클래스 에 대응 하 는 클래스 를 호출 하여 예화 한 것 임 을 나타 냅 니 다.총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.