1 package io.swagger.v3.core.util;
2
3 import com.fasterxml.jackson.core.JsonParser;
4 import com.fasterxml.jackson.core.JsonProcessingException;
5 import com.fasterxml.jackson.databind.DeserializationContext;
6 import com.fasterxml.jackson.databind.JsonDeserializer;
7 import com.fasterxml.jackson.databind.JsonNode;
8 import com.fasterxml.jackson.databind.node.ObjectNode;
9 import io.swagger.v3.oas.models.responses.ApiResponse;
10 import io.swagger.v3.oas.models.responses.ApiResponses;
11
12 import java.io.IOException;
13 import java.util.Iterator;
14 import java.util.LinkedHashMap;
15 import java.util.Map;
16
17 public class ApiResponsesDeserializer extends JsonDeserializer<ApiResponses> {
18     @Override
19     public ApiResponses deserialize(JsonParser jp, DeserializationContext ctxt)
20             throws IOException, JsonProcessingException {
21         ApiResponses result = new ApiResponses();
22         JsonNode node = jp.getCodec().readTree(jp);
23         ObjectNode objectNode = (ObjectNode)node;
24         Map<String, Object> extensions = new LinkedHashMap<>();
25         for (Iterator<String> it = objectNode.fieldNames(); it.hasNext(); ) {
26             String childName = it.next();
27             JsonNode child = objectNode.get(childName);
28             // if name start with `x-` consider it an extesion
29             if (childName.startsWith("x-")) {
30                 extensions.put(childName, Json.mapper().convertValue(child, Object.class));
31             } else {
32                 result.put(childName, Json.mapper().convertValue(child, ApiResponse.class));
33             }
34         }
35         if (!extensions.isEmpty()) {
36             result.setExtensions(extensions);
37         }
38         return result;
39     }
40 }
41