真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot實現(xiàn)子類的反序列化示例代碼

目標(biāo)

陽信網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。成都創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

在SpringBoot接口中,我們一般用@RequestBody類注解需要反序列化的對象,但是當(dāng)存在多個子類的情況下,常規(guī)的反序列化不能滿足需求,比如:

我們有一個類Exam用于表示一張試卷:

@Data
public class Exam {

 private String name;
 private List questions;
}

這里Question比較特殊,Question本身是一個抽象類,提供了一些通用的方法調(diào)用,實際子類有單選題、多選題、判斷題多種情況

SpringBoot實現(xiàn)子類的反序列化示例代碼

實現(xiàn)

SprintBoot內(nèi)置的序列化是使用的Jackson,查閱文檔后發(fā)現(xiàn)Jackson提供了@JsonTypeInfo和@JsonSubTypes這兩個注解,搭配使用,可以根據(jù)指定的字段值來指定實例化中用到的具體的子類類型

這幾個類的實際代碼如下:

抽象基類Question:

@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

單選題SingleChoiceQuestion:

@Data
@EqualsAndHashCode(callSuper = true)
public class SingleChoiceQuestion extends ChoiceQuestion {

  public SingleChoiceQuestion() {
    this.type = SINGLE_CHOICE;
  }
}

多選題MultipleChoiceQuestion:

@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對象,返回解析結(jié)果:

@RequestMapping(value = "/exam", method = RequestMethod.POST)
public List parseExam(@RequestBody Exam exam) {
  List 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 types = new ArrayList<>();
  for (Question question : exam.getQuestions()) {
    types.add(question.getType());
  }
  results.add(String.format("Questions types: %s", types.toString()));
  return results;
}

項目跑起來,調(diào)用接口測試一下:

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字段都能正確讀取,表明反序列化過程中確實是調(diào)用了具體子類對應(yīng)的類來進(jìn)行實例化的。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對創(chuàng)新互聯(lián)的支持。


網(wǎng)頁標(biāo)題:SpringBoot實現(xiàn)子類的反序列化示例代碼
轉(zhuǎn)載來于:http://weahome.cn/article/gchicg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部